IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Conditions + requêtes dans une procédure stockée


Sujet :

SQL Procédural MySQL

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut Conditions + requêtes dans une procédure stockée
    Bonjour à tous.

    J'espère avant tout que quelqu'un pourra m'aider à résoudre mon problème, ça fait 4 jours que je planche dessus et... je ne vois aucune issue de secours
    Je vous préviens, ce post sera long (voire très long)

    Je vais d'abord essayer d’énoncer clairement les faits :

    J'ai une base (appelons-la BOTIN1) composée de 2 tables (appelons-les annuaire1 et annuaire2).

    Structure annuaire1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    CREATE TABLE annuaire1
    (
    	id_ann1 int primary key not null auto_increment,
    	col1 varchar (25),
    	col2 varchar (100) not null,
    	col3 varchar (8),
    	col4 varchar (20),
    	col5 varchar (20),
    	mail varchar (70),
    	telephone varchar (17), 
    	telephone2 varchar (40),
    	col9 varchar (6),
    	col10 varchar (9),
    	col11 varchar (100),
    	col12 varchar (100),
    	col13 varchar (100),
    	col14 varchar (3),
    	col15 char (45),
    	col16 char (32)
    	
    );
    Structure annuaire2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE annuaire2
    (
    	id_ann2 int primary key not null auto_increment,
    	col1 varchar (255) not null,
    	col2 varchar (50) not null,
    	col3 varchar (50) not null,
    	col4 varchar (100),
    	col5 char (40),
    	col6 varchar (8),
    	mail2 varchar (50),
    	tel1 varchar (12),
    	tel2 varchar (12),
    	tel3 varchar (12)
    );
    Remarque : dans cette table, les entrées peuvent être multiples, c'est-à-dire que je peux avoir (si je ne me trompe pas) au maximum deux fois la même personne (avec la même adresse mail donc), mais avec un numéro de téléphone différent (et c'est là que se situe tout mon problème). Cela signifie que ces personnes ont deux numéros de téléphones. Ne me demandez pas pourquoi ces différents numéros de téléphone ne sont pas renseignés sur la même ligne, mais dans la colonne « tel2 », je n’en sais rien, c'est comme ça...

    Dans la table annuaire1 :
    Comme vous pouvez le deviner, j'ai des numéros de téléphone dans le champ "telephone". Mais, il en manque certains. Et SURTOUT, certains numéros sont FAUX (because changements de numéros, etc)

    Mon objectif :
    • Récupérer les numéros manquants grâce au champ "tel1" de la table "annuaire2"
    • CORRIGER les faux numéros (toujours grâce au champ "tel1" de "annuaire2". Voire, grâce au champ "tel2"...)


    Pour ce faire, j'ai créé une autre base (appelons-la BOTIN2), avec une autre table. Appelons cette table annuaire_final

    Structure annuaire_final :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE annuaire_final
    (
    	id_ann_fin int primary key not null auto_increment,
    	mail varchar (70), //l’adresse mail de botin1.annuaire1
    	tel1 varchar (17),
    	tel2 varchar (17)
    	tel3 varchar (17) //les trois champs sont issus de botin1.annuaire2
    );
    Au début de mon travail, j'avais involontairement omis la partie "entrées pouvant être multiples". Je ne m'étais occupée que du cas "champs vides », donc je me contentais de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    INSERT INTO botin2.annuaire_final (`mail`, `tel1`, `tel2`, `tel3`)
    SELECT mail, tel1, tel2, tel3
    FROM botin1.annuaire1, botin1.annuaire2 
    WHERE telephone ='' 
    AND tel != ''
    AND mail = mail2 
    AND mail != '' 
    ;
    Ce qui fonctionne très bien... mais ne répond pas intégralement à ce que je souhaite faire.

    En réfléchissant un peu, j'ai essayé de poser les différentes étapes dont j'avais besoin pour faire ce que je veux faire :

    Si annuaire1.mail = annuaire2.mail2 (et que mail != '' et que telephone != ''... mais ça complexifie les choses pour le moment)

    1. Si le champ "annuaire1.telephone" est vide : j'envoie dans annuaire_final.tel (de la base botin2) la valeur qui correspond grâce à la requête que j'ai mise juste au-dessus
    2. Si le champ "annuaire1.telephone n'est pas vide :
      1. Comparaison du "annuaire1.telephone" avec "annuaire2.tel1" :

      1. si les deux valeurs sont égales => ne rien faire
      2. Si les valeurs ne sont pas égales :

      1. Comparaison de "annuaire1.telephone" avec "annuaire2.tel2" :

      1. Si les valeurs sont égales => ne rien faire
      2. Si les valeurs ne sont pas égales => exécution de la requête du haut


    En écrivant tout ça, j'ai peur d'avoir oublié une/des subtilité(s). Ce que je dois éviter, dans tous les cas d'avoir sur une même ligne deux fois le même numéro dans la table botin2.annuaire_final, ce qui est un des risques (puisque plusieurs entrées, blablabla).

    C'est là qu'entre en compte les IF et les procédures stockées.

    J'ai bien compris qu'on ne pouvait pas faire de IF dans une requête "basique". Donc, hop là, je voulais tout foutre dans une procédure stockée. Alors, bon, j'ai bien vu que les IF et les ELSE, en SQL, n'avaient pas vraiment la même structure que dans les autres langages... mais je me suis lancée tout de même.

    J'ai d'abord voulu commencer par quelque chose de simple. J'ai donc essayé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    BEGIN
     
    IF annuaire1.mail = annuaire2.mail2 THEN
    IF annuaire1.telephone = "" THEN INSERT INTO botin2.annuaire_final (`mail`, `tel1`, `tel2`, `tel3`)
    SELECT mail, tel1, tel2, tel3
    FROM botin1.annuaire1, botin1.annuaire2 
    WHERE mail = mail2 
    AND telephone =''
    AND tel1 != ''
    AND mail != '' ;
    END IF;
    END IF;
     
    END
    Mais… ça ne fonctionne pas. Alors, concrètement, je ne sais pas si ce que j’ai écrit (en terme de structure pure des IF/ELSE) est bon ou pas (ce qui, déjà, ne m’aide pas). Il faut dire qu'en cherchant des heures et des heures, je n'ai trouvé AUCUN exemple similaire au mien sur internet.

    Tel quel, quand j’exécute ma procédure, j’ai ce message d’erreur : ‘MySQL a répondu :#1109 – Unknown table ‘annuaire1.mail » in field list’'.
    Message que je ne comprends pas trop, puisque ma procédure se trouve dans ma base « botin1 », qu’elle a donc accès aux deux tables qui sont dedans, que je spécifie bien… bref. Clairement, il me manque un truc (ou alors tout est faux, lol)…
    Si je modifie mon premier IF en :

    J’ai le message suivant : ‘MySQL a répondu : #1054 – Unknown column ‘mail’ in ‘field list ‘

    Alors, si déjà, je bloque avec cette toute petite partie de requête, je n’ose imaginer avec TOUTES les requêtes/conditions que j’aimerais mettre…

    Bref, est-ce que quelqu’un a une solution pour moi ?
    Je vous en serai reconnaissante à vie !

    Merci d’avance à ceux qui prendront le temps de se casser la tête sur mon problème.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    1) on peut faire du IF dans une requête basique, sauf qu'il faut utiliser CASE WHEN, ou éventuellement IF() dans les cas simples et si tu n'es pas trop à cheval sur la normalisation...

    2) Dans ta proc stock, il faudrait que tu crées un curseur pour faire ton IF annuaire1.mail = annuaire2.mail2 dessus. Mais bon, ça me semble inutilement compliqué, la requête basique devrait suffire.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut
    Merci pour ta réponse.

    J'avais vu le "CASE WHEN" et le IF() dans la doc MySQL (et même sur d'autres forums), le truc, c'est que, comme je n'ai vu aucun exemple similaire à mon cas + j'ai lu qu'on ne pouvait faire des if/else dans des procédures stockées ou des fonctions...
    Et puis, même, dans mon cas, je ne vois pas du tout comment organiser ma requête...

    Je viens de faire une tentative avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CASE 
    WHEN mail = mail2
    THEN INSERT INTO botin2.annuiaire_final (`mail`, `tel1`, `tel2`, `tel3`)
    SELECT mail, tel1, tel2, tel3
    FROM botin1.annuaire1, botin1.annuaire2 
    WHERE telephone ='' 
    AND tel1 != ''
    AND mail = mail2 
    AND mail != '' 
    ;
    Mais j'ai une erreur dès la ligne 1

    Et avec un IF, je ne vois pas du tout comment faire, vu la structure demandée...

    Si je me base sur ce que je vois, ça ressemblerait à un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    IF (annuaire1.mail = annuaire2.mail2,
    WHEN mail = mail2
    THEN INSERT INTO botin2.annuaire_final (`mail`, `tel1`, `tel2`, `tel3`)
    SELECT mail, tel1, tel2, tel3
    FROM botin1.annuaire1, botin1.annuaire2 
    WHERE telephone ='' 
    AND tel1 != ''
    AND mail = mail2 
    AND mail != '' 
    ;,
     -- ne rien faire
    )
    ;
    Mais, bizarrement, je ne pense pas que ça soit ça (et étant donné que j'ai essayé, je peux l'affirmer, ce n'est pas ça)...

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Je n'ai pas compris votre règle de gestion (un jeu d'essai avec résultat attendu permettrait surement de mieux comprendre), mais votre requête devrait ressembler à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    SELECT 
        CASE 
            WHEN a1.telephone = '' THEN a2.tel1 
            ELSE 
                CASE WHEN a1.telephone = a2.tel1 
                    THEN ???
                    ELSE ???
                END
            END as tel1
    ,...
    FROM botin1.annuaire1 a1
    INNER JOIN  botin1.annuaire2 a2
        ON a2.mail = a1.mail
    WHERE A1.mail <> ''
    ce n'est qu'un exemple pour vous montrer l'utilisation de CASE... WHEN..., je vous laisse mettre les bonnes conditions et résultat selon vos besoins.

  5. #5
    Membre éclairé Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    595
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 595
    Points : 879
    Points
    879
    Par défaut
    Bonjour.
    En reprenant ton algo :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    UPDATE annuaire1 a1 LEFT JOIN annuaire2 a2 ON a1.mail=a2.mail2 SET 
    IF(a1.telephone='',
    	a1.telephone=a2.tel1,
    		IF(a1.telephone!=a2.tel1,
    			IF(a1.telephone!=a2.tel2,
    				a1.telephone=a2.tel1,),))
    WHERE a1.telephone='' AND a1.mail !=''
    aux erreurs de syntaxe prêt ...
    Note bien que le numéro choisi (venant de a2.tel1 ou a2.tel2) est toujours mis à jour dans a1.telephone et que tu ne vérifies rien concernant a1.telephone2 et a2.tel3 ...

    Yves.
    Participez vous aussi !
    Message utile
    Discussion résolue

  6. #6
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut
    Alors... voila ce que j'ai (en gros). Je vais essayer d'exposer tous mes "cas de conscience" problématiques, lol.
    (je précise que ces données viennent de fichiers csv que j'importe dans ma BDD. Ces deux fichiers ne dépendent pas l'un de l'autre).

    Avant toute chose, je vais mettre la requête que j'utilise actuellement pour regrouper les infos de mes deux tables (je ne crois pas que je l'avais postée auparavant). Elle corrige en parti l'oubli dont j'avais parlé dans mon 1er post :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO botin2.annuaire_final (`mail`, `tel1`, `tel2`, `tel3`)
    select A1.mail, A2.tel1, A2.tel2, A2.tel3
    from botin1.A1, botin1.A2
    where A1.telephone != A2.tel1
    and A1.mail = A2.mail2
    and A1.mail != ''
    and A2.tel1 != '';
    --------------------

    BDD BOTIN1
    Table A1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    mail                         telephone1    telephone2 
    ------                       ----------    ---------- 
    toto.dupont@domain.fr               
    titi.henri@domain.fr         0102030405    0504030201
    tata.martin@domain.fr        0607080900
    tutu.lopez@domain.fr         0806040200
    Dans ma table A1, toutes mes entrées sont uniques.
    Ici, par exemple, il me manque le numéro de toto dupont (partons du principe que ce monsieur n'a qu'un seul numéro)
    Imaginons également que le numéro de tata martin soit faux. (et elle n'a qu'un seul numéro)
    Pour Titi henri & tutu, tout est ok.

    A partir de là, voila à quoi peut ressembler la table A2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    mail2                   tel1         tel2         tel3
    ------                 -----        -----        ----- 
    tutu.lopez@domain.fr   --vide
    toto.dupont@domain.fr  0709010305       
    titi.henri@domain.fr   0504030201
    tata.martin@domain.fr  0006040208
    tutu.lopez@domain.fr                0806040200
    titi.henri@domain.fr   0102030405
    Comme vous pouvez le constater, les entrées dans cette table peuvent être multiples.
    Je veux (en fait, c'est plutôt je dois, mais restons réalistes pour le moment, lol) pouvoir insérer dans une 3ème table les numéros de téléphone, et surtout, les attribuer aux bonnes personnes.
    Tout en partant du principe que :

    • Ma table A2 est ma table référence pour récupérer les numéros de téléphone.
    • Je ne dois pas avoir deux fois le même numéro sur la même ligne (logique)


    Dans ma troisième table (botin2.annuaire_final), je dois donc avoir quelque chose qui ressemble -dans l'idéal- à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    mail                   tel1         tel2         tel3
    ------                 -----        -----        -----
    tutu.lopez@domain.fr   0806040200
    toto.dupont@domain.fr  0709010305       
    titi.henri@domain.fr   0504030201   0102030405  #ou ordre inversé
    tata.martin@domain.fr  0006040208
    Les cas les plus faciles à gérer sont ceux de Tata martin & Toto dupont. D'ailleurs avec eux, je n'ai pas de problèmes.

    Ceux de Titi & Tutu sont un peu plus "subtils".

    Pour Tutu : son numéro était bon dans la première table. Le problème, c'est que dans la 2ème table, son nom apparait deux fois, il n'a aucun "tel1" référencé, et son numéro principal se trouve dans "tel2", et dans sa 2ème occurrence.
    Du coup, avec la requête que j'ai collée plus haut, ce qu'il se passe, c'est que la requête va envoyer dans la 3ème table un champ vide (puisque de A1.telephone != A1.tel1).
    Je dois donc pouvoir prendre en compte dans ma requête le fait que : si le A1.telephone = A1.tel1 OU A1.telephone = A1.tel2 ALORS ne rien faire

    Pour Titi (c'est un cas encore plus chiant) : ses deux numéros sont bien dans la 1ère table. MAIS il a deux occurrences dans la deuxième table, et le numéro de la 1ère occurrence est dans la colonne A1.telephone2.
    Ce qui signifie que ma requête va comparer A1.telephone avec A2.tel1 de la 1ère occurrence, voir que les numéros ne sont pas identiques, et donc envoyer dans la 3ème table A2.tel1 (ce qui voudra dire que j'aurai annuaire_final.tel1 = A2.tel1). Et je n'aurais rien sur le reste de la ligne.
    Quand ma requête arrivera à la 2ème occurrence de Titi, elle va faire la comparaison entre A1.telephone et A2.tel et verra que les numéros sont les mêmes. & donc n'enverra rien dans la 3ème table.

    (j'ai l'impression d'écrire du charabia...)

    Le truc, c'est que ma table botin2.annuaire_final a pour but d'être ensuite envoyé dans l'AD, pour corriger les numéros de téléphone, donc je dois fournir un fichier le moins faux possible.
    Je crois avoir évoqué les cas qui me causaient le plus de soucis, mais peut-être que j'en oublie...

    Honnêtement, je ne sais pas si tout ça va vous aider à y voir plus clair.
    & je ne sais pas s'il y a une requête qui pourra m'aider à faire ce que je veux faire. Ou au moins me rapprocher de quelque chose de propre.
    Si je peux le faire en 2 ou 3 requêtes, ça me va aussi...
    Actuellement, à part avec des IF/ELSE, je ne sais pas s'il y a d'autres possibilités pour réussir (et encore, je ne maîtrise même pas la syntaxe des IF/ELSE en SQL...).

    Donc je m'en remets à des personnes qui connaissent mieux le SQL que moi, et qui, peut-être, verront une ou des alternatives...

    Edit : le message d'Yves est venu s'intercaler pendant ma (longue) rédaction.
    Tout d'abord, merci pour ta réponse.
    Ensuite, je ne vérifie pas A2.tel3 car très rares sont les entrées à avoir 3 numéros (sur environ 17000 entrées, il n'y en a que 7). Je suis donc sûre à 99.9% qu'il n'y a aucune erreur quant à l'attribution du tel3.
    Et c'est en rédigeant ce long message que je me suis rendue compte qu'il me faudrait ajouter une vérif' sur A1.telephone2 (qui est un champ multivalué. C'est-à-dire qu'il peut accueillir deux numéros, mais c'est un cas que je n'ai pas rencontré jusqu'à présent) et A2.tel2. Faire une sorte de croisement en fait, lors de la vérification, entre A1.telephone/A1.telephone2 et A2.tel1/A2.tel2...

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut eveanne.

    J'ai repris ton exemple, bien plus parlant que tout le blablabla de ton premier message. Désolé de le dire, mais je n'ai pas compris grand chose à tes explications.
    J'ai trouvé une solution à ton problème. Et je l'ai testé !

    Pour ce faire, j'ai dû :
    1) créer une table intermédiaire 'botin_temp' qui contiendra tous les couples (mail, téléphone).
    2) supprimer tous les doublons (mail, téléphone), sur les deux tables. Ceci a été fait par le 'union'.
    3) créer une procédure stockée qui va lire la table 'botin_temp', gérer la rupture de séquence sur 'mail' et venir insérer une ligne dans 'botin_final'.
    4) utiliser le 'NULL' pour l'absence d'information. Tu devras tester le vide en ajoutant un test supplémentaire dans le 'union'.

    Voici le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `botin_A1`
    --------------
     
    --------------
    CREATE TABLE `botin_A1` (
            `mail` CHAR(30)  NOT NULL,
            `tel1` CHAR(10)      NULL DEFAULT NULL,
            `tel2` CHAR(10)      NULL DEFAULT NULL,
            primary key (`mail`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a1` (`mail`,`tel1`,`tel2`) values
      ('toto.dupont@domain.fr',  default,      default),
      ('titi.henri@domain.fr',  '0102030405', '0504030201'),
      ('tata.martin@domain.fr', '0607080900',  default),
      ('tutu.lopez@domain.fr',  '0806040200',  default)
    --------------
     
    --------------
    select * from botin_a1
    --------------
     
    +-----------------------+------------+------------+
    | mail                  | tel1       | tel2       |
    +-----------------------+------------+------------+
    | tata.martin@domain.fr | 0607080900 | NULL       |
    | titi.henri@domain.fr  | 0102030405 | 0504030201 |
    | toto.dupont@domain.fr | NULL       | NULL       |
    | tutu.lopez@domain.fr  | 0806040200 | NULL       |
    +-----------------------+------------+------------+
    --------------
    DROP TABLE IF EXISTS `botin_A2`
    --------------
     
    --------------
    CREATE TABLE `botin_a2` (
            `id`    INT UNSIGNED  NOT NULL AUTO_INCREMENT,
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL,
            primary key (`id`,`mail`),
            UNIQUE INDEX (`id`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a2` (`mail`,`tel1`,`tel2`,`tel3`) values
      ('tutu.lopez@domain.fr',   default,      default,     default),
      ('toto.dupont@domain.fr', '0709010305',  default,     default),
      ('titi.henri@domain.fr',  '0504030201',  default,     default),
      ('tata.martin@domain.fr', '0006040208',  default,     default),
      ('tutu.lopez@domain.fr',   default,     '0806040200', default),
      ('titi.henri@domain.fr',  '0102030405',  default,     default)
    --------------
     
    --------------
    select * from botin_a2
    --------------
     
    +----+-----------------------+------------+------------+------+
    | id | mail                  | tel1       | tel2       | tel3 |
    +----+-----------------------+------------+------------+------+
    |  1 | tutu.lopez@domain.fr  | NULL       | NULL       | NULL |
    |  2 | toto.dupont@domain.fr | 0709010305 | NULL       | NULL |
    |  3 | titi.henri@domain.fr  | 0504030201 | NULL       | NULL |
    |  4 | tata.martin@domain.fr | 0006040208 | NULL       | NULL |
    |  5 | tutu.lopez@domain.fr  | NULL       | 0806040200 | NULL |
    |  6 | titi.henri@domain.fr  | 0102030405 | NULL       | NULL |
    +----+-----------------------+------------+------------+------+
    --------------
    DROP TABLE IF EXISTS `botin_temp`
    --------------
     
    --------------
    CREATE TABLE `botin_temp` (
      `mail`  char(30)     NOT NULL,
      `tel`   char(10)         NULL DEFAULT NULL,
      primary key (`mail`,`tel`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_temp` (`mail`,`tel`)
    select mail, tel1 as tel from botin_a2 where tel1 is not null
    union
    select mail, tel2 as tel from botin_a2 where tel2 is not null
    union
    select mail, tel3 as tel from botin_a2 where tel3 is not null
    union
    select mail, tel1 as tel from botin_a1 where tel1 is not null
    union
    select mail, tel2 as tel from botin_a1 where tel2 is not null
    --------------
     
    --------------
    select * from botin_temp
    --------------
     
    +-----------------------+------------+
    | mail                  | tel        |
    +-----------------------+------------+
    | tata.martin@domain.fr | 0006040208 |
    | tata.martin@domain.fr | 0607080900 |
    | titi.henri@domain.fr  | 0102030405 |
    | titi.henri@domain.fr  | 0504030201 |
    | toto.dupont@domain.fr | 0709010305 |
    | tutu.lopez@domain.fr  | 0806040200 |
    +-----------------------+------------+
    --------------
    DROP TABLE IF EXISTS `botin_final`
    --------------
     
    --------------
    CREATE TABLE `botin_final` (
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS `remplir`
    --------------
     
    --------------
    CREATE PROCEDURE `remplir`()
    BEGIN
    DECLARE _rupt   CHAR(30);
     
    DECLARE _clef   CHAR(30);
    DECLARE _tel    CHAR(10);
     
    DECLARE _mail   CHAR(30);
    DECLARE _tel1   CHAR(10) DEFAULT NULL;
    DECLARE _tel2   CHAR(10) DEFAULT NULL;
    DECLARE _tel3   CHAR(10) DEFAULT NULL;
     
    DECLARE _fin INTEGER DEFAULT 1;
    DECLARE _tab CURSOR FOR SELECT mail, tel from botin_temp order by mail;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
    OPEN _tab;
    FETCH _tab INTO _clef, _tel;
    SET _rupt = _clef;
     
    WHILE (_fin)
    DO
      if (_rupt = _clef) then
        SET _mail = _clef;
     
        if     (_tel1 is null) then SET _tel1 = _tel;
        elseif (_tel2 is null) then SET _tel2 = _tel;
        elseif (_tel3 is null) then SET _tel3 = _tel;
        end if;
      else
        insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
        SET _mail = _clef;
        SET _tel1 = _tel;
        SET _tel2 = null;
        SET _tel3 = null;
            SET _rupt = _clef;
      end if;
     
      FETCH _tab INTO _clef, _tel;
    END WHILE;
     
    insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
    CLOSE _tab;
    END
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    call remplir()
    --------------
     
    --------------
    select * from botin_final
    --------------
     
    +-----------------------+------------+------------+------+
    | mail                  | tel1       | tel2       | tel3 |
    +-----------------------+------------+------------+------+
    | tata.martin@domain.fr | 0006040208 | 0607080900 | NULL |
    | titi.henri@domain.fr  | 0102030405 | 0504030201 | NULL |
    | toto.dupont@domain.fr | 0709010305 | NULL       | NULL |
    | tutu.lopez@domain.fr  | 0806040200 | NULL       | NULL |
    +-----------------------+------------+------------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Tu devras effectuer un test un peu plus poussé que je ne l'ai fait. Un bon jeu d'essai est essentiel à la vérification du fonctionnement de ce problème.
    S'il y a quelque chose qui ne va pas, tu me le dis !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut
    @Artemus24 : oui, je me rends bien compte que mon premier message pouvait être légèrement (euphémisme) incompréhensible
    Sinon, que dire sur le script que tu me proposes, à part :
    Déjà, merci pour tout ce travail, et donc, tout ce temps consacré à mon problème. Je n'en demandais et n'imaginais pas tant

    Il va falloir que je reprenne ça tranquillement, ligne par ligne, pour l'adapter à mes bases (qui sont bien plus grandes et différentes que ce que j'ai mis en exemple)

    Quand je regarde le résultat final, il me satisfait, à un détail près...

    Il s'agit du cas de Tata martin (qu'à l'origine, je n'ai pas de problème à traiter, mais avec ta solution, je me pose certaines questions)
    J'avais précisé dans mon exemple que son numéro dans la 1ère table était faux, et qu'il me fallait donc récupérer le numéro de la 2ème table. Or, dans ta table finale, j'ai les deux numéros, le faux et le correct.

    Cela est dû au fait que dans la table botin_temp, tu récupères TOUS les numéros des deux tables "principales".
    Donc, forcément, ceux de la 1ère table.
    Donc, forcément, ceux qui sont bons (mais ça, on peut pas le savoir), comme les faux (ça non plus, on peut pas le savoir).
    Et j'arrive pas trop à voir comment (et où) on peut améliorer ça....

    EDIT : je suis en train d'adapter tes requêtes à mon cas.

    Et je me retrouve notamment devant ceci :

    Table 1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    +-----------------------+------------+
    | mail                  | tel        |
    +-----------------------+------------+
    | machine@domain.fr     | 0006040208 |
    +-----------------------+------------+
    Tabel 2 (table référence pour les n° de tel)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    +-----------------------+------------+------------+
    | mail                  | tel        | tel2       |
    +-----------------------+------------+------------+
    | machine@domain.fr     | 1234567890 | 9876543210 |
    +-----------------------+------------+------------+
    De ce fait, dans mon "annuaire_final", je ne dois avoir QUE ces deux numéros là attribués à Machine.

    La "transition" via l'annuaire temporaire me ramène les trois numéros dans la table.
    Et donc, dans l'annuaire final, j'aurai, je pense, les trois numéros...

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 131
    Points : 38 546
    Points
    38 546
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Eveanne Voir le message
    J'avais précisé dans mon exemple que son numéro dans la 1ère table était faux, et qu'il me fallait donc récupérer le numéro de la 2ème table. Or, dans ta table finale, j'ai les deux numéros, le faux et le correct.
    - Est-ce que tout numéro différent de celui de l'annuaire2 pour une même personne est forcément faux ? sinon comment détermine -t- on qu'un numéro de annuaire1 est faux ?
    - Est ce que toute personne présente dans annuaire 1 l'est aussi dans annuaire 2 ?
    Si oui, il me semble plus simple de supprimer tous les numéros de annuaire1 et de les reprendre depuis 2 sans se poser de question

    Si cette base annuaire vous appartient, et que ce n'est pas trop tard, revoyez plutôt la modélisation :
    - une table avec un enregistrement unique par contact : id_personne, mail, nom, prénom etc...
    - une table avec un enregistrement par n° de téléphone d'un contact et un typage de ce n° : id_personne, type_n°, numéro
    - une table de typologie de n° : tél fixe domicile, fixe travail, portable perso, portable astreinte etc...

    Revoyez aussi les règles d'alimentation pour interdire catégoriquement
    Citation Envoyé par Eveanne Voir le message
    je me suis rendue compte qu'il me faudrait ajouter une vérif' sur A1.telephone2 (qui est un champ multivalué. C'est-à-dire qu'il peut accueillir deux numéros, mais c'est un cas que je n'ai pas rencontré jusqu'à présent)
    Dans une base de données, une colonne ne doit contenir qu'une seule valeur !
    Et profitez de l'occasion pour remplacer les varchar de moins de 20 ou 30 caractères par du char fixe, bien plus simple à utiliser
    On trouve dans annuaire1 une colonne en varchar(3) c'est complètement aberrant !

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Eveanne.

    Citation Envoyé par Eveanne
    Déjà, merci pour tout ce travail, et donc, tout ce temps consacré à mon problème. Je n'en demandais et n'imaginais pas tant
    Merci à toi. Je n'ai pas passé énormément de temps sur ce problème (environ trois heures).
    J'ai plus passé du temps à comprendre ce que tu cherchais à faire que d'écrire la solution que je t'ai proposé.

    Citation Envoyé par Eveanne
    Quand je regarde le résultat final, il me satisfait, à un détail près...
    J'ai fusionné tous les numéros en rejetant les doublons.

    Citation Envoyé par Eveanne
    J'avais précisé dans mon exemple que son numéro dans la 1ère table était faux ...
    Et comment sais-tu qu'il est faux ? Si la syntaxe est bonne mais si le numéro est aux abonnés absents, comment le sauras-tu ?

    Citation Envoyé par Eveanne
    ... et qu'il me fallait donc récupérer le numéro de la 2ème table.
    Là aussi, comment sais-tu qu'il faut récupérer que les numéros de la deuxième table et pads ceux de la première ?
    Si tu récupères que les numéros de la seconde table, et qu'il n'y en a aucun alors tu n'as plus aucun numéros pour ce mail.

    Citation Envoyé par Eveanne
    Or, dans ta table finale, j'ai les deux numéros, le faux et le correct.
    Quel est le critère qui te permet de dire que l'un est faux et l'autre est juste ? C'est plus une question fonctionnelle que technique.

    Citation Envoyé par Eveanne
    Donc, forcément, ceux qui sont bons (mais ça, on peut pas le savoir), comme les faux (ça non plus, on peut pas le savoir).
    Je ne connais pas le rôle joué par ta seconde table vis-à-vis de la première.
    Mais n'est-ce pas du genre remplace l'existent de la première table si la seconde est renseignée ?

    Citation Envoyé par Eveanne
    Et j'arrive pas trop à voir comment (et où) on peut améliorer ça....
    Si dans la seconde table, il n'y a aucun numéro alors conserver ceux de la première.
    Si dans la seconde table, il y a des numéros alors ceux-ci vienne écraser ceux de la première.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Eveanne.

    J'ai repris mon exemple, et je sélectionne les numéros de téléphones en fonction de l'existence des numéros dans la seconde table (comme je l'ai indiqué dans mon precédent message). Le cas du mail 'tata' est alors résolu.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `botin_A1`
    --------------
     
    --------------
    CREATE TABLE `botin_A1` (
            `mail` CHAR(30)  NOT NULL,
            `tel1` CHAR(10)      NULL DEFAULT NULL,
            `tel2` CHAR(10)      NULL DEFAULT NULL,
            primary key (`mail`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a1` (`mail`,`tel1`,`tel2`) values
      ('toto.dupont@domain.fr',  default,      default),
      ('titi.henri@domain.fr',  '0102030405', '0504030201'),
      ('tata.martin@domain.fr', '0607080900',  default),
      ('tutu.lopez@domain.fr',  '0806040200',  default)
    --------------
     
    --------------
    select * from botin_a1
    --------------
     
    +-----------------------+------------+------------+
    | mail                  | tel1       | tel2       |
    +-----------------------+------------+------------+
    | tata.martin@domain.fr | 0607080900 | NULL       |
    | titi.henri@domain.fr  | 0102030405 | 0504030201 |
    | toto.dupont@domain.fr | NULL       | NULL       |
    | tutu.lopez@domain.fr  | 0806040200 | NULL       |
    +-----------------------+------------+------------+
    --------------
    DROP TABLE IF EXISTS `botin_A2`
    --------------
     
    --------------
    CREATE TABLE `botin_a2` (
            `id`    INT UNSIGNED  NOT NULL AUTO_INCREMENT,
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL,
            primary key (`id`,`mail`),
            UNIQUE INDEX (`id`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a2` (`mail`,`tel1`,`tel2`,`tel3`) values
      ('tutu.lopez@domain.fr',   default,      default,     default),
      ('toto.dupont@domain.fr', '0709010305',  default,     default),
      ('titi.henri@domain.fr',  '0504030201',  default,     default),
      ('tata.martin@domain.fr', '0006040208',  default,     default),
      ('tutu.lopez@domain.fr',   default,     '0806040200', default),
      ('titi.henri@domain.fr',  '0102030405',  default,     default)
    --------------
     
    --------------
    select * from botin_a2
    --------------
     
    +----+-----------------------+------------+------------+------+
    | id | mail                  | tel1       | tel2       | tel3 |
    +----+-----------------------+------------+------------+------+
    |  1 | tutu.lopez@domain.fr  | NULL       | NULL       | NULL |
    |  2 | toto.dupont@domain.fr | 0709010305 | NULL       | NULL |
    |  3 | titi.henri@domain.fr  | 0504030201 | NULL       | NULL |
    |  4 | tata.martin@domain.fr | 0006040208 | NULL       | NULL |
    |  5 | tutu.lopez@domain.fr  | NULL       | 0806040200 | NULL |
    |  6 | titi.henri@domain.fr  | 0102030405 | NULL       | NULL |
    +----+-----------------------+------------+------------+------+
    --------------
    DROP TABLE IF EXISTS `botin_temp`
    --------------
     
    --------------
    CREATE TABLE `botin_temp` (
      `mail`  char(30)     NOT NULL,
      `tel`   char(10)         NULL DEFAULT NULL,
      `num`   char(01)         NULL DEFAULT NULL,
      primary key (`mail`,`tel`,`num`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_temp` (`mail`,`tel`,`num`)
    select mail, tel1 as tel, '2' as num from botin_a2 where tel1 is not null
    union
    select mail, tel2 as tel, '2' as num from botin_a2 where tel2 is not null
    union
    select mail, tel3 as tel, '2' as num from botin_a2 where tel3 is not null
    union
    select mail, tel1 as tel, '1' as num from botin_a1 where tel1 is not null
    union
    select mail, tel2 as tel, '1' as num from botin_a1 where tel2 is not null
    --------------
     
    --------------
    select * from botin_temp
    --------------
     
    +-----------------------+------------+-----+
    | mail                  | tel        | num |
    +-----------------------+------------+-----+
    | tata.martin@domain.fr | 0006040208 | 2   |
    | tata.martin@domain.fr | 0607080900 | 1   |
    | titi.henri@domain.fr  | 0102030405 | 1   |
    | titi.henri@domain.fr  | 0102030405 | 2   |
    | titi.henri@domain.fr  | 0504030201 | 1   |
    | titi.henri@domain.fr  | 0504030201 | 2   |
    | toto.dupont@domain.fr | 0709010305 | 2   |
    | tutu.lopez@domain.fr  | 0806040200 | 1   |
    | tutu.lopez@domain.fr  | 0806040200 | 2   |
    +-----------------------+------------+-----+
    --------------
    DROP TABLE IF EXISTS `botin_final`
    --------------
     
    --------------
    CREATE TABLE `botin_final` (
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS `remplir`
    --------------
     
    --------------
    CREATE PROCEDURE `remplir`()
    BEGIN
    DECLARE _rupt   CHAR(30);
    DECLARE _flag   CHAR(01);
     
    DECLARE _clef   CHAR(30);
    DECLARE _tel    CHAR(10);
    DECLARE _num    CHAR(01);
     
    DECLARE _mail   CHAR(30);
    DECLARE _tel1   CHAR(10) DEFAULT NULL;
    DECLARE _tel2   CHAR(10) DEFAULT NULL;
    DECLARE _tel3   CHAR(10) DEFAULT NULL;
     
    DECLARE _fin INTEGER DEFAULT 1;
    DECLARE _tab CURSOR FOR SELECT mail, tel, num from botin_temp order by mail, num desc;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
    OPEN _tab;
    FETCH _tab INTO _clef, _tel, _num;
    SET _rupt = _clef;
    SET _flag = _num;
     
    WHILE (_fin)
    DO
      if (_rupt = _clef) then
        SET _mail = _clef;
     
            if (_num = _flag) then
          if     (_tel1 is null) then SET _tel1 = _tel;
          elseif (_tel2 is null) then SET _tel2 = _tel;
          elseif (_tel3 is null) then SET _tel3 = _tel;
          end if;
            end if;
      else
        insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
        SET _mail = _clef;
        SET _tel1 = _tel;
        SET _tel2 = null;
        SET _tel3 = null;
        SET _rupt = _clef;
            SET _flag = _num;
      end if;
     
      FETCH _tab INTO _clef, _tel, _num;
    END WHILE;
     
    insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
    CLOSE _tab;
    END
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    call remplir()
    --------------
     
    --------------
    select * from botin_final
    --------------
     
    +-----------------------+------------+------------+------+
    | mail                  | tel1       | tel2       | tel3 |
    +-----------------------+------------+------------+------+
    | tata.martin@domain.fr | 0006040208 | NULL       | NULL |
    | titi.henri@domain.fr  | 0102030405 | 0504030201 | NULL |
    | toto.dupont@domain.fr | 0709010305 | NULL       | NULL |
    | tutu.lopez@domain.fr  | 0806040200 | NULL       | NULL |
    +-----------------------+------------+------------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Le problème que tu rencontres provient du fait que ta table n'est pas correctement normalisée.
    --> Première forme normale : doit contenir des valeurs non répétitives.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  12. #12
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut
    Je vais essayer de répondre à toutes vos questions.

    - Est-ce que tout numéro différent de celui de l'annuaire2 pour une même personne est forcément faux ? sinon comment détermine -t- on qu'un numéro de annuaire1 est faux ?
    Et comment sais-tu qu'il est faux ? Si la syntaxe est bonne mais si le numéro est aux abonnés absents, comment le sauras-tu ?
    Là aussi, comment sais-tu qu'il faut récupérer que les numéros de la deuxième table et pads ceux de la première ?
    Si tu récupères que les numéros de la seconde table, et qu'il n'y en a aucun alors tu n'as plus aucun numéros pour ce mail.
    Toutes ces questions se rejoignent un peu.

    Pourquoi récupérer les n° de la 2ème table et pas de la 1ère.
    "Tout simplement" (peut-être ne l'avais-je pas précisé) parce que la 2ème table, c'est l'annuaire téléphonique (table1 = AD)
    On m'a donc dit de partir du principe que tous les numéros y sont corrects, et à jour.

    A partir de ça, si, pour une même adresse mail, le numéro de la table1 est différent de celui de la table2, je garde celui de la table2, car il provient directement de l'annuaire téléphonique.
    De plus, si une personne fait une recherche sur l'annuaire en ligne, c'est bien le/les numéros de la table2 qui ressortent (mais ça... c'est logique)
    S'il y a des erreurs dans l'annuaire téléphonique... he bien, ce n'est pas de mon ressort... :/

    Dans la requête que j'avais postée plus haut, je m'arrangeais pour ne pas prendre en compte les champs "tel" vides. Donc je vais devoir faire pareil avec ta solution, Artemus24.

    Je récupère cet annuaire directement depuis l'annuaire LDAP du service concerné. J'obtiens un CSV, que j'importe tel quel dans ma table botin1.annuaire2. C'est une fois dans la base que je fais toutes les modifs dont j'ai besoin (supprimer les lignes inutiles, et j'en passe, mais ça, on s'en moque un peu).

    Quand une modif est faite dans l'annuaire tel, elle n'est répercutée nul part ailleurs.
    Je dois donc lister les "couples" "mail/tel" dans un fichier dans un format spécifique (mail | tel1 | tel2 | tel3).
    Je refile ensuite ce fichier à un autre service, qui va s'occuper de compléter l'AD.

    - Est ce que toute personne présente dans annuaire 1 l'est aussi dans annuaire 2 ?
    Non.
    Il y a beaucoup plus d'entrées dans la table 1 que dans la table2 (ce qui est normal, car toute la population de mon entreprise n'a pas forcément de n° de téléphone).

    Je ne connais pas le rôle joué par ta seconde table vis-à-vis de la première.
    Mais n'est-ce pas du genre remplace l'existent de la première table si la seconde est renseignée ?
    Ces deux tables ne sont pas liées.
    Je dois juste me servir de l'une d'entre-elles pour récupérer certaines informations, qui aideront à compléter l'autre.

  13. #13
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut
    Artemus24 :

    Je viens d'adapter ton script à mes bases. La bonne nouvelle, c'est que j'ai un résultat assez probant

    La "mauvaise" nouvelle (mais ce n'en est pas vraiment une ), c'est que je n'avais pas compris que ta procédure stockée m'enverrait dans annuaire_final (quasiment) TOUTE ma table2 avec les bons numéros/numéro bis etc...
    Je pensais que je n'obtiendrai que les lignes pour lesquelles la comparaison table1/table2 différaient...

    Etant donné que c'est une procédure qui sera exécutée (je pense), une fois par semaine, je n'ai besoin de récupérer que les lignes pour lesquels il y a une/des modifications à faire.
    Ca permettait notamment de voir si le nombre de modif stagne/réduit/augmente...

    Là, j'ai 15000 lignes dans l'annuaire_final, mais ça sera pareil la semaine prochaine, et celle d'après, etc.

    Je comprends qu'avec toutes les possibilités foireuses qu'offrent mes tables, ce soit quelque chose de difficile à faire (voire impossible), mais dans l'idéal, c'est ce qu'il me faudrait...

    (oui, on peut dire que je suis chiante )

  14. #14
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Eveanne.

    Citation Envoyé par Eveanne
    je n'avais pas compris que ta procédure stockée m'enverrait dans annuaire_final (quasiment) TOUTE ma table2 avec les bons numéros/numéro bis etc...
    Le problème est que ton jeu d'essai n'était pas assez parlant pour faire une analyse correcte. J'ai en effet fusionné les deux tables en rejetant les doublons.

    Citation Envoyé par Eveanne
    Je pensais que je n'obtiendrai que les lignes pour lesquelles la comparaison table1/table2 différaient...
    Tu voulais dire que la table1 servait comme table de référence. Donc aucun ajout de nouvelles lignes en provenance de table2.

    Citation Envoyé par Eveanne
    je n'ai besoin de récupérer que les lignes pour lesquels il y a une/des modifications à faire.
    Mais pourquoi faire une table qui ne contient que les modifications ? Est-ce à cause d'une question de volumétrie ?

    Citation Envoyé par Eveanne
    Ca permettait notamment de voir si le nombre de modif stagne/réduit/augmente...
    Donc pour faire une statistique !

    Ca fait une sacré différence dans ton traitement entre ton premier message et maintenant.

    Citation Envoyé par Eveanne
    si, pour une même adresse mail, le numéro de la table1 est différent de celui de la table2, je garde celui de la table2, car il provient directement de l'annuaire téléphonique.
    Citation Envoyé par Eveanne
    S'il y a des erreurs dans l'annuaire téléphonique... he bien, ce n'est pas de mon ressort... :/
    Citation Envoyé par Eveanne
    Je dois juste me servir de l'une d'entre-elles pour récupérer certaines informations, qui aideront à compléter l'autre.
    On résume le traitement à faire.
    Si un mail est présent dans la table2 ainsi que dans table1, je récupère la table2.
    Si un mail est présent dans la table1 mais absent dans la table2, je récupère la table1.
    En procédant ainsi, il n'y a pas d'ajout de nouvelles lignes.

    Et en plus, tu ne veux que les lignes différentes ! Est-ce bien cela ?

    Il y a quelque chose que je ne comprends pas dans le résultat que tu veux produire, par rapport à ton exemple.
    Est-ce que la table 'botin_final' doit contenir la nouvelle version de la table 'botin_a1' ?
    Autrement dit, elle va au final écraser la table 'botin_a1'. Est-ce bien cela ?

    Mais si tu veux uniquement la différence, c'est-à-dire les lignes venant modifier la table 'botin_a1', alors tu dois récupérer que les lignes de table2.
    C'est-à-dire que les 'mail' présent dans les deux tables.

    Mais si au lien de raisonner sur le 'mail', on raisonne sur le numéro de téléphone alors cela devient plus compliqué.

    Que dois-je faire si un numéro de téléphone est présent dans table1 mais absent dans table2 ? Dois-je le reconduire ou bien il est devenu obsolète ?
    D'après ce que j'ai compris, les numéros valides sont présents dans la table2.

    Voici une nouvelle version.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `botin_A1`
    --------------
     
    --------------
    CREATE TABLE `botin_A1` (
            `mail` CHAR(30)  NOT NULL,
            `tel1` CHAR(10)      NULL DEFAULT NULL,
            `tel2` CHAR(10)      NULL DEFAULT NULL,
            primary key (`mail`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a1` (`mail`,`tel1`,`tel2`) values
      ('toto.dupont@domain.fr',  default,      default),
      ('titi.henri@domain.fr',  '0102030405', '0504030201'),
      ('tata.martin@domain.fr', '0607080900',  default),
      ('tutu.lopez@domain.fr',  '0806040200',  default),
      ('tete.martin@domain.fr', '0907050301',  default)
    --------------
     
    --------------
    select * from botin_a1
    --------------
     
    +-----------------------+------------+------------+
    | mail                  | tel1       | tel2       |
    +-----------------------+------------+------------+
    | tata.martin@domain.fr | 0607080900 | NULL       |
    | tete.martin@domain.fr | 0907050301 | NULL       |
    | titi.henri@domain.fr  | 0102030405 | 0504030201 |
    | toto.dupont@domain.fr | NULL       | NULL       |
    | tutu.lopez@domain.fr  | 0806040200 | NULL       |
    +-----------------------+------------+------------+
    --------------
    DROP TABLE IF EXISTS `botin_A2`
    --------------
     
    --------------
    CREATE TABLE `botin_a2` (
            `id`    INT UNSIGNED  NOT NULL AUTO_INCREMENT,
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL,
            primary key (`id`,`mail`),
            UNIQUE INDEX (`id`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a2` (`mail`,`tel1`,`tel2`,`tel3`) values
      ('tutu.lopez@domain.fr',   default,      default,     default),
      ('toto.dupont@domain.fr', '0709010305',  default,     default),
      ('titi.henri@domain.fr',  '0504030201',  default,     default),
      ('tata.martin@domain.fr', '0006040208',  default,     default),
      ('tutu.lopez@domain.fr',   default,     '0806040200', default),
      ('titi.henri@domain.fr',  '0102030405',  default,     default),
      ('tyty.durant@domain.fr', '0703080209',  default,     default)
    --------------
     
    --------------
    select * from botin_a2
    --------------
     
    +----+-----------------------+------------+------------+------+
    | id | mail                  | tel1       | tel2       | tel3 |
    +----+-----------------------+------------+------------+------+
    |  1 | tutu.lopez@domain.fr  | NULL       | NULL       | NULL |
    |  2 | toto.dupont@domain.fr | 0709010305 | NULL       | NULL |
    |  3 | titi.henri@domain.fr  | 0504030201 | NULL       | NULL |
    |  4 | tata.martin@domain.fr | 0006040208 | NULL       | NULL |
    |  5 | tutu.lopez@domain.fr  | NULL       | 0806040200 | NULL |
    |  6 | titi.henri@domain.fr  | 0102030405 | NULL       | NULL |
    |  7 | tyty.durant@domain.fr | 0703080209 | NULL       | NULL |
    +----+-----------------------+------------+------------+------+
    --------------
    DROP TABLE IF EXISTS `botin_temp`
    --------------
     
    --------------
    CREATE TABLE `botin_temp` (
      `mail`  char(30)     NOT NULL,
      `tel`   char(10)         NULL DEFAULT NULL,
      primary key (`mail`,`tel`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_temp` (`mail`,`tel`)
          select mail, tel1 as tel from botin_a2 as t2 where tel1 is not null and     exists (select mail from botin_a1 as t1 where t2.mail = t1.mail)
    union select mail, tel2 as tel from botin_a2 as t2 where tel2 is not null and     exists (select mail from botin_a1 as t1 where t2.mail = t1.mail)
    union select mail, tel3 as tel from botin_a2 as t2 where tel3 is not null and     exists (select mail from botin_a1 as t1 where t2.mail = t1.mail)
    union select mail, tel1 as tel from botin_a1 as t1 where tel1 is not null and not exists (select mail from botin_a2 as t2 where t1.mail = t2.mail)
    union select mail, tel2 as tel from botin_a1 as t1 where tel2 is not null and not exists (select mail from botin_a2 as t2 where t1.mail = t2.mail)
    --------------
     
    --------------
    select * from botin_temp
    --------------
     
    +-----------------------+------------+
    | mail                  | tel        |
    +-----------------------+------------+
    | tata.martin@domain.fr | 0006040208 |
    | tete.martin@domain.fr | 0907050301 |
    | titi.henri@domain.fr  | 0102030405 |
    | titi.henri@domain.fr  | 0504030201 |
    | toto.dupont@domain.fr | 0709010305 |
    | tutu.lopez@domain.fr  | 0806040200 |
    +-----------------------+------------+
    --------------
    DROP TABLE IF EXISTS `botin_final`
    --------------
     
    --------------
    CREATE TABLE `botin_final` (
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS `remplir`
    --------------
     
    --------------
    CREATE PROCEDURE `remplir`()
    BEGIN
    DECLARE _rupt   CHAR(30);
     
    DECLARE _clef   CHAR(30);
    DECLARE _tel    CHAR(10);
     
    DECLARE _mail   CHAR(30);
    DECLARE _tel1   CHAR(10) DEFAULT NULL;
    DECLARE _tel2   CHAR(10) DEFAULT NULL;
    DECLARE _tel3   CHAR(10) DEFAULT NULL;
     
    DECLARE _fin INTEGER DEFAULT 1;
    DECLARE _tab CURSOR FOR SELECT mail, tel from botin_temp order by mail;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
    OPEN _tab;
    FETCH _tab INTO _clef, _tel;
    SET _rupt = _clef;
     
    WHILE (_fin)
    DO
      if (_rupt = _clef) then
        SET _mail = _clef;
     
        if     (_tel1 is null) then SET _tel1 = _tel;
        elseif (_tel2 is null) then SET _tel2 = _tel;
        elseif (_tel3 is null) then SET _tel3 = _tel;
        end if;
      else
        insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
        SET _mail = _clef;
        SET _tel1 = _tel;
        SET _tel2 = null;
        SET _tel3 = null;
        SET _rupt = _clef;
      end if;
     
      FETCH _tab INTO _clef, _tel;
    END WHILE;
     
    insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
    CLOSE _tab;
    END
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    call remplir()
    --------------
     
    --------------
    select * from botin_final
    --------------
     
    +-----------------------+------------+------------+------+
    | mail                  | tel1       | tel2       | tel3 |
    +-----------------------+------------+------------+------+
    | tata.martin@domain.fr | 0006040208 | NULL       | NULL |
    | tete.martin@domain.fr | 0907050301 | NULL       | NULL |
    | titi.henri@domain.fr  | 0102030405 | 0504030201 | NULL |
    | toto.dupont@domain.fr | 0709010305 | NULL       | NULL |
    | tutu.lopez@domain.fr  | 0806040200 | NULL       | NULL |
    +-----------------------+------------+------------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Si tu ne veux pas obtenir dans 'botin_final' les mail qui sont déjà présents dans table1 mais absents de table2 alors tu supprimes ce qui suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    union select mail, tel1 as tel from botin_a1 as t1 where tel1 is not null and not exists (select mail from botin_a2 as t2 where t1.mail = t2.mail)
    union select mail, tel2 as tel from botin_a1 as t1 where tel2 is not null and not exists (select mail from botin_a2 as t2 where t1.mail = t2.mail)
    Autrement dit, tu ne reconduis pas ce qui n'a pas changé !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  15. #15
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut
    Bonjour Artemus !

    Désolée pour mon manque de clarté parfois . J’essaye d’être précise, mais bon… visiblement, je n’y arrive pas toujours…

    Je n’ai pas encore pris la peine de regarder tes nouvelles requêtes (le weekend, j’essaye de couper avec ce truc !!).

    Je vais juste revenir sur ton commentaire :

    Mais pourquoi faire une table qui ne contient que les modifications ? Est-ce à cause d'une question de volumétrie ?
    Je l’ai expliqué dans un commentaire précédent il me semble.
    Je dois fournir un fichier formaté d’une certaine manière (il me faut les colonnes : Mail | tel1 | tel2 | tel3). Avec mes petites connaissances de SQL, la seule manière que j’ai trouvée, c’est faire une table à part, pour pouvoir l’exporter ensuite en CSV…
    Je refile ce fichier à un service. Ce service a mis en place un script (dont je n’ai pas le fonctionnement entier en tête) qui parcourt ce fichier, en se basant sur les adresses mails, puis injecte les numéros présents dans ce fichier dans l’AD (table1 = AD, importé via un CSV).
    L’exécution du script prendra bien moins de temps avec juste les lignes à modifier, qu’avec 17 000 lignes (enfin, logiquement...).

    Donc pour faire une statistique !
    Oui et non. On ne va pas relever précieusement à chaque fois le nombre de lignes présentes dans « annuaire_final », mais ça permettra juste d’avoir une vision sur l’évolution du nombre de modif…

    On résume le traitement à faire.
    Si un mail est présent dans la table2 ainsi que dans table1, je récupère la table2.
    Si un mail est présent dans la table1 mais absent dans la table2, je récupère la table1.
    En procédant ainsi, il n'y a pas d'ajout de nouvelles lignes.
    Je pense que tu voulais écrire « si un téléphone est présent… » ? (on va tous finir par perdre la tête, lol)

    Je vais être plus précise :

    Si un numéro est présent dans table2 ainsi que dans table1, mais qu’ils sont différents : récupération de table2 et on l’envoie dans « annuaire_final »
    Si un numéro est présent dans table1 mais absent de table2 : on garde table1, et on n’envoie rien dans annuaire_final.
    (tout en prenant en compte les cas particuliers évoqués dans les commentaires précédents, et que ton script actuel résout déjà)

    Et en plus, tu ne veux que les lignes différentes ! Est-ce bien cela ?
    C’est ça. C’est-à-dire que si, dans ma table1 et dans ma table2, pour une même adresse mail, les numéros de téléphone sont les mêmes => on n’envoie rien dans annuaire_final.

    Il y a quelque chose que je ne comprends pas dans le résultat que tu veux produire, par rapport à ton exemple.
    Est-ce que la table 'botin_final' doit contenir la nouvelle version de la table 'botin_a1' ?
    Autrement dit, elle va au final écraser la table 'botin_a1'. Est-ce bien cela ?
    Non non, mon « annuaire_final » ne va pas écraser la table1. Il va servir à alimenter le vrai AD.

    Mais si tu veux uniquement la différence, c'est-à-dire les lignes venant modifier la table 'botin_a1', alors tu dois récupérer que les lignes de table2.
    C'est-à-dire que les 'mail' présent dans les deux tables.
    +

    Que dois-je faire si un numéro de téléphone est présent dans table1 mais absent dans table2 ? Dois-je le reconduire ou bien il est devenu obsolète ?
    D'après ce que j'ai compris, les numéros valides sont présents dans la table2.
    Alors, je ne suis pas sûre d’avoir bien compris ce que tu voulais dire… mais évidemment que s’il y a des correction à faire, ces numéros ne peuvent venir que de la table2. Et il faut que les mails soient présents dans les deux tables... sinon, je n'ai rien pour comparer mes deux tables.
    Et si un numéro est présent dans table1, mais pas dans table2, on laisse tel quel = on n’envoie rien dans annuaire_final.

    C’est pour cela que dans ma requête originale, ma condition disait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    where A1.telephone != A2.tel1
    and A1.mail = A2.mail2
    and A1.mail != ''
    and A2.tel1 != '' ;
    Je ne prenais pas en compte les lignes dont le champ tel1 était vide (puisque pas de comparaison possible).
    Alors qu’à l’inverse, si le champ « telephone » de la table1 est vide, et que celui de table2 est rempli, on récupère celui de table2 et on le balance dans annuaire_final.

    Je vais aller modifier ma procédure stockée avec ce que tu m’as donné, et voir le résultat.

    Si tu as d’autres questions, ou des points à éclaircir, n’hésite pas.

    Et, je ne te le dirai jamais assez, mais un immense MERCI pour ton aide

  16. #16
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut Eveanne.

    Citation Envoyé par Eveanne
    Désolée pour mon manque de clarté parfois.
    50% de la solution d'un problème passe par la bonne compréhension de son énoncé.

    Citation Envoyé par Eveanne
    Je n’ai pas encore pris la peine de regarder tes nouvelles requêtes (le weekend, j’essaye de couper avec ce truc !!).
    Je comprends parfaitement que cela soit une prise de tête. Dans la mesure de mes moyens, je vais essayer de t'aider à trouver une solution à ton problème.
    Je ne réponds pas à tous les sujets, mais juste à ceux que je trouve pertinents comme le tien.

    Citation Envoyé par Eveanne
    Je dois fournir un fichier formaté d’une certaine manière (il me faut les colonnes : Mail | tel1 | tel2 | tel3).
    En somme, tu travailles sous contraintes et tu n'es pas libre de chosir la meilleure solution.

    Citation Envoyé par Eveanne
    Avec mes petites connaissances de SQL, la seule manière que j’ai trouvée, c’est faire une table à part, pour pouvoir l’exporter ensuite en CSV…
    Dans un premier temps, il vaut mieux décomposer étape par étape, même si au final il y aura des regroupement.
    Par exemple, ma table 'botin_temp' n'est pas nécessaire car l'on peut mettre directement dans la procédure, la requête de remplissage de cette table.

    Citation Envoyé par Eveanne
    Je pense que tu voulais écrire « si un téléphone est présent… » ? (on va tous finir par perdre la tête, lol)
    Après relecture, je m'apercois que je ne suis pas clair sur ce sujet ou plutôt ambigüe.
    Je voulais signifier que je traite que les lignes qui sont identifées par 'mail'.
    Autrement dit, je n'ai pas été suffisament précis et j'aurai dû associer à ce 'mail' aussi le numéro de téléphone.

    Citation Envoyé par Eveanne
    Si un numéro est présent dans table2 ainsi que dans table1, mais qu’ils sont différents : récupération de table2 et on l’envoie dans « annuaire_final »
    Un numéro est présent dans table2 mais absent de table1. Je sélectionne ce numéro de téléphone de table2.
    Mais s'ils sont identiques que dois-je faire ? Je choisi de ne pas le prendre ce numéro.

    Citation Envoyé par Eveanne
    Si un numéro est présent dans table1 mais absent de table2 : on garde table1, et on n’envoie rien dans annuaire_final.
    D'accord !

    Mais que dois-je faire, si un numéro de téléphone est présent dans les deux tables ?
    A priori, je pense que je ne dois pas le prendre. C'est ce point qui n'est pas clair.

    Citation Envoyé par Eveanne
    (tout en prenant en compte les cas particuliers évoqués dans les commentaires précédents, et que ton script actuel résout déjà)
    Désolé, mais j'avais compris que l'on raisonnait juste au niveau de la ligne et non du numéro de téléphone.
    Pour tenir compte des numéros de téléphones, la modification à faire est très simple, mais cela va alourdir le traitement des requêtes.

    On résume :

    1) si mail de table2 est identique avec mail de table1.
    --> si téléphone présent dans table2 mais absent de table1 alors on prend.
    --> si téléphone présent dans table2 et présent aussi dans table1 alors on ne prend pas.

    2) si mail de table2 est absent dans table1 alors on ne fait rien.
    Pour le cas 1) et le cas 2) voici comment je procède.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    insert into `botin_temp` (`mail`,`tel`)
          select mail,  tel1 as tel  from botin_a2 as t2 where tel1 is not null
          and    exists (select mail from botin_a1 as t1 where t2.mail = t1.mail) and tel1 not in (
                 select tel1 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel1 is not null
          union  select tel2 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel2 is not null
          )
    union select mail,  tel2 as tel  from botin_a2 as t2 where tel2 is not null
          and    exists (select mail from botin_a1 as t1 where t2.mail = t1.mail) and tel2 not in (
                 select tel1 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel1 is not null
          union  select tel2 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel2 is not null
          )
    union select mail,  tel3 as tel  from botin_a2 as t2 where tel3 is not null
          and    exists (select mail from botin_a1 as t1 where t2.mail = t1.mail) and tel3 not in (
                 select tel1 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel1 is not null
          union  select tel2 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel2 is not null
          )
    3) mail de table1 est absent dans table2 alors je reconduie la table1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    union select  mail,   tel1 as tel  from botin_a1 as t1 where tel1 is not null
          and mail not in (select mail from botin_a2 as t2)
    union select  mail,   tel2 as tel  from botin_a1 as t1 where tel2 is not null
          and mail not in (select mail from botin_a2 as t2)
    Voici mon dernier jeu d'essai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `botin_A1`
    --------------
     
    --------------
    CREATE TABLE `botin_A1` (
            `mail` CHAR(30)  NOT NULL,
            `tel1` CHAR(10)      NULL DEFAULT NULL,
            `tel2` CHAR(10)      NULL DEFAULT NULL,
            primary key (`mail`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a1` (`mail`,`tel1`,`tel2`) values
      ('toto.dupont@domain.fr',  default,      default),
      ('titi.henri@domain.fr',  '0102030405', '0504030201'),
      ('tata.martin@domain.fr', '0607080900',  default),
      ('tutu.lopez@domain.fr',  '0806040200',  default),
      ('tete.martin@domain.fr', '0907050301',  default)
    --------------
     
    --------------
    select * from botin_a1
    --------------
     
    +-----------------------+------------+------------+
    | mail                  | tel1       | tel2       |
    +-----------------------+------------+------------+
    | tata.martin@domain.fr | 0607080900 | NULL       |
    | tete.martin@domain.fr | 0907050301 | NULL       |
    | titi.henri@domain.fr  | 0102030405 | 0504030201 |
    | toto.dupont@domain.fr | NULL       | NULL       |
    | tutu.lopez@domain.fr  | 0806040200 | NULL       |
    +-----------------------+------------+------------+
    --------------
    DROP TABLE IF EXISTS `botin_A2`
    --------------
     
    --------------
    CREATE TABLE `botin_a2` (
            `id`    INT UNSIGNED  NOT NULL AUTO_INCREMENT,
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL,
            primary key (`id`,`mail`),
            UNIQUE INDEX (`id`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a2` (`mail`,`tel1`,`tel2`,`tel3`) values
      ('toto.dupont@domain.fr', '0709010305',  default,     default),
      ('titi.henri@domain.fr',  '0504030201',  default,     default),
      ('titi.henri@domain.fr',  '0102030405',  default,     default),
      ('tata.martin@domain.fr', '0006040208',  default,     default),
      ('tutu.lopez@domain.fr',   default,      default,     default),
      ('tutu.lopez@domain.fr',   default,     '0806040200', default),
      ('tyty.durant@domain.fr', '0703080209',  default,     default)
    --------------
     
    --------------
    select * from botin_a2
    --------------
     
    +----+-----------------------+------------+------------+------+
    | id | mail                  | tel1       | tel2       | tel3 |
    +----+-----------------------+------------+------------+------+
    |  1 | toto.dupont@domain.fr | 0709010305 | NULL       | NULL |
    |  2 | titi.henri@domain.fr  | 0504030201 | NULL       | NULL |
    |  3 | titi.henri@domain.fr  | 0102030405 | NULL       | NULL |
    |  4 | tata.martin@domain.fr | 0006040208 | NULL       | NULL |
    |  5 | tutu.lopez@domain.fr  | NULL       | NULL       | NULL |
    |  6 | tutu.lopez@domain.fr  | NULL       | 0806040200 | NULL |
    |  7 | tyty.durant@domain.fr | 0703080209 | NULL       | NULL |
    +----+-----------------------+------------+------------+------+
    --------------
    DROP TABLE IF EXISTS `botin_temp`
    --------------
     
    --------------
    CREATE TABLE `botin_temp` (
      `mail`  char(30)     NOT NULL,
      `tel`   char(10)         NULL DEFAULT NULL,
      primary key (`mail`,`tel`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_temp` (`mail`,`tel`)
          select  mail,   tel1 as tel  from botin_a2 as t2 where tel1 is not null
          and     exists  (select mail from botin_a1 as t1 where t2.mail = t1.mail) and tel1 not in (
                  select  tel1 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel1 is not null
          union   select  tel2 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel2 is not null
          )
    union select  mail,   tel2 as tel  from botin_a2 as t2 where tel2 is not null
          and     exists  (select mail from botin_a1 as t1 where t2.mail = t1.mail) and tel2 not in (
                  select  tel1 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel1 is not null
          union   select  tel2 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel2 is not null
          )
    union select  mail,   tel3 as tel  from botin_a2 as t2 where tel3 is not null
          and     exists  (select mail from botin_a1 as t1 where t2.mail = t1.mail) and tel3 not in (
                  select  tel1 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel1 is not null
          union   select  tel2 as tel  from botin_a1 as t1 where t2.mail = t1.mail  and tel2 is not null
          )
    union select  mail,   tel1 as tel  from botin_a1 as t1 where tel1 is not null
          and mail not in (select mail from botin_a2 as t2)
    union select  mail,   tel2 as tel  from botin_a1 as t1 where tel2 is not null
          and mail not in (select mail from botin_a2 as t2)
    --------------
     
    --------------
    select * from botin_temp
    --------------
     
    +-----------------------+------------+
    | mail                  | tel        |
    +-----------------------+------------+
    | tata.martin@domain.fr | 0006040208 |
    | tete.martin@domain.fr | 0907050301 |
    | toto.dupont@domain.fr | 0709010305 |
    +-----------------------+------------+
    --------------
    DROP TABLE IF EXISTS `botin_final`
    --------------
     
    --------------
    CREATE TABLE `botin_final` (
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS `remplir`
    --------------
     
    --------------
    CREATE PROCEDURE `remplir`()
    BEGIN
    DECLARE _rupt   CHAR(30);
     
    DECLARE _clef   CHAR(30);
    DECLARE _tel    CHAR(10);
     
    DECLARE _mail   CHAR(30);
    DECLARE _tel1   CHAR(10) DEFAULT NULL;
    DECLARE _tel2   CHAR(10) DEFAULT NULL;
    DECLARE _tel3   CHAR(10) DEFAULT NULL;
     
    DECLARE _fin INTEGER DEFAULT 1;
    DECLARE _tab CURSOR FOR SELECT mail, tel from botin_temp order by mail, tel;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
    OPEN _tab;
    FETCH _tab INTO _clef, _tel;
    SET _rupt = _clef;
     
    WHILE (_fin)
    DO
      if (_rupt = _clef) then
        SET _mail = _clef;
     
        if     (_tel1 is null) then SET _tel1 = _tel;
        elseif (_tel2 is null) then SET _tel2 = _tel;
        elseif (_tel3 is null) then SET _tel3 = _tel;
        end if;
      else
        insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
        SET _mail = _clef;
        SET _tel1 = _tel;
        SET _tel2 = null;
        SET _tel3 = null;
        SET _rupt = _clef;
      end if;
     
      FETCH _tab INTO _clef, _tel;
    END WHILE;
     
    insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
    CLOSE _tab;
    END
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    call remplir()
    --------------
     
    --------------
    select * from botin_final
    --------------
     
    +-----------------------+------------+------+------+
    | mail                  | tel1       | tel2 | tel3 |
    +-----------------------+------------+------+------+
    | tata.martin@domain.fr | 0006040208 | NULL | NULL |
    | tete.martin@domain.fr | 0907050301 | NULL | NULL |
    | toto.dupont@domain.fr | 0709010305 | NULL | NULL |
    +-----------------------+------------+------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Je pense que les cas 1) et 2) sont bien traités.

    Ce qui me pose encore un problème de compréhension, c'est le cas 3).

    Le résultat obtenu de mon test concerne d'une part les modification apportées par la table2 si mail de la table1 existe et d'autre part, j'ai reconduit la table1 si elle est absente de table2.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  17. #17
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut
    Salut Artemus

    J'ai regardé ton dernier jeu d'essai, et malheureusement... ça ne correspond toujours pas à ce que je souhaite obtenir, tout simplement parce que le point un peu tordu que j'avais évoqué au tout début et que tu avais réussi à corriger... n'est plus corrigé

    Je pense que je vais reprendre tes tables exemples, les remplir un peu plus pour te donner une meilleure vision de ce que j'ai, et mettre le résultat "attendu".

    Je vais essayer de te donner ça cet après-midi, avant que je ne quitte mon boulot

    Je vais quand même répondre à tes interrogations :

    En somme, tu travailles sous contraintes et tu n'es pas libre de chosir la meilleure solution.
    C'est plus ou moins ça, oui.
    Je peux utiliser toutes les méthodes que je veux, passer par toutes les alternatives que je veux, tant qu'à la fin, je donne un fichier sous ce format là, avec ce qu'il faut là où il faut.

    Je voulais signifier que je traite que les lignes qui sont identifées par 'mail'.
    Haa. oui, c'est ça, c'est exactement ça.
    Quand il n'y a pas de mail, on zappe. On ne se prend pas la tête.

    Un numéro est présent dans table2 mais absent de table1. Je sélectionne ce numéro de téléphone de table2.
    C'est ça.
    On envoie le mail et le/les numéros qui vont bien dans annuaire_final

    Mais s'ils sont identiques que dois-je faire ? Je choisi de ne pas le prendre ce numéro.
    C'est ça.
    Si les numéros sont identiques, ça signifie que l'AD est correctement rempli, donc pas la peine d'aller modifier quoi que ce soit (donc pas besoin d'envoyer dans annuaire_final)

    Mais que dois-je faire, si un numéro de téléphone est présent dans les deux tables ?
    A priori, je pense que je ne dois pas le prendre. C'est ce point qui n'est pas clair.
    Bon, je l'ai déjà écrit juste au-dessus, mais c'est exact.
    Si on retrouve le même numéro dans les deux tables : on ne fait rien, on n'envoie rien nul part.

    On résume :

    1) si mail de table2 est identique avec mail de table1.
    --> si téléphone présent dans table2 mais absent de table1 alors on prend.
    --> si téléphone présent dans table2 et présent aussi dans table1 alors on ne prend pas.
    Oui !

    2) si mail de table2 est absent dans table1 alors on ne fait rien.
    C'est ça.
    Et pareil si c'est l'inverse, évidemment.
    D'ailleurs, il est plus probable que le mail ne soit pas renseigné dans la table2 (l'annuaire téléphonique) que dans la table1.

    3) mail de table1 est absent dans table2 alors je reconduie la table1.
    Dans ce cas, on ne fait rien non plus (comme le cas 2) ). On n'envoie rien dans annuaire_final.

    Je vais m'atteler à te refaire des exemples plus fournis.

  18. #18
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut eveanne.

    Voici un tableau des différents cas que l'on peut avoir :

    Légende :
    '11111' c'est un nuémro de téléphone.
    'AAAAA' c'est une adresse mail.
    '.....' aucune information : NULL ou vide dans la colonne.

    Si 'MAIL' = '.....' alors la ligne n'existe pas dans l'autre table.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
    +=====+======================++==============================++==============================+===============================+
    |     |      Annuaire 1      ||          Annuaire 2          ||        Annuaire Final        |                               |
    | Cas |------+-------+-------++------+-------+-------+-------++------+-------+-------+-------|          Commentaire          |
    |     | MAIL | TEL 1 | TEL 2 || MAIL | TEL 1 | TEL 2 | TEL 3 || MAIL | TEL 1 | TEL 2 | TEL 3 |                               |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  1  | AAAA | 11111 | 22222 || .... | ..... | ..... | ..... || .... | ..... | ..... | ..... | Pas de reconduction           |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  2  | .... | ..... | ..... || BBBB | 11111 | ..... | ..... || .... | ..... | ..... | ..... | Pas de reconduction           |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  3  | CCCC | ..... | ..... || CCCC | 11111 | 22222 | 33333 || CCCC | 11111 | 22222 | 33333 | Reconduction à l identique    | 
    +-----+------+-------+-------++------+-------+-------+-------++------+-------+-------+-------+-------------------------------+
    |  4  | DDDD | ..... | ..... || DDDD | 11111 | ..... | ..... || DDDD | 11111 | 22222 | 33333 | Idem que cas 3) mais sur      |
    |     |      |       |       || DDDD | 22222 | ..... | ..... ||      |       |       |       | plusieurs lignes.             |
    |     |      |       |       || DDDD | 33333 | ..... | ..... ||      |       |       |       |                               |
    +-----+------+-------+-------++------+-------+-------+-------++------+-------+-------+-------+-------------------------------+
    |  5  | EEEE | ..... | ..... || EEEE | 11111 | ..... | 22222 || EEEE | 11111 | 22222 | 33333 | On s arrête à 3 Numéros de    |
    |     |      |       |       || EEEE | 33333 | ..... | ..... ||      |       |       |       | Téléphone.                    |
    |     |      |       |       || EEEE | 44444 | 55555 | ..... ||      |       |       |       | On ignore les autres numéros. |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  6  | FFFF | 11111 | 22222 || FFFF | 11111 | 22222 | ..... || .... | ..... | ..... | ..... | Pas de reconduction car       |
    |     |      |       |       ||      |       |       |       ||      |       |       |       | identique.                    |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  7  | GGGG | 11111 | 22222 || GGGG | 22222 | 33333 | ..... || GGGG | 33333 | ..... | ..... | Reconduction de ce qui est    |  
    |     |      |       |       ||      |       |       |       ||      |       |       |       | uniquement différent.         |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    Si tu vois autre chose alors tu peux compléter ce tableau.

    Les cas 3), 4) et 5) en fait, c'est le même cas mais qui se présente différemment.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  19. #19
    Membre du Club
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    32
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 32
    Points : 42
    Points
    42
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    +=====+======================++==============================++==============================+===============================+
    |     |      Annuaire 1      ||          Annuaire 2          ||        Annuaire Final        |                               |
    | Cas |------+-------+-------++------+-------+-------+-------++------+-------+-------+-------|          Commentaire          |
    |     | MAIL | TEL 1 | TEL 2 || MAIL | TEL 1 | TEL 2 | TEL 3 || MAIL | TEL 1 | TEL 2 | TEL 3 |                               |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  1  | AAAA | 11111 | 22222 || .... | ..... | ..... | ..... || .... | ..... | ..... | ..... | Pas de reconduction           | -- OK
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  2  | .... | ..... | ..... || BBBB | 11111 | ..... | ..... || .... | ..... | ..... | ..... | Pas de reconduction           | -- OK
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  3  | CCCC | ..... | ..... || CCCC | 11111 | 22222 | 33333 || CCCC | 11111 | 22222 | 33333 | Reconduction à l identique    | -- OK / fonctionne également dans le cas où il n'y a que deux numéros dans l'Annuaire 2
    +-----+------+-------+-------++------+-------+-------+-------++------+-------+-------+-------+-------------------------------+
    |  4  | DDDD | ..... | ..... || DDDD | 11111 | ..... | ..... || DDDD | 11111 | 22222 | 33333 | Idem que cas 3) mais sur      |
    |     |      |       |       || DDDD | 22222 | ..... | ..... ||      |       |       |       | plusieurs lignes.             | -- OK (fonctionne également dans le cas ou DDDD n'apparait que deux fois dans Annuaire 2)
    |     |      |       |       || DDDD | 33333 | ..... | ..... ||      |       |       |       |                               |
    +-----+------+-------+-------++------+-------+-------+-------++------+-------+-------+-------+-------------------------------+
    |  5  | EEEE | ..... | ..... || EEEE | 11111 | ..... | 22222 || EEEE | 11111 | 22222 | 33333 | On s arrête à 3 Numéros de    |
    |     |      |       |       || EEEE | 33333 | ..... | ..... ||      |       |       |       | Téléphone.                    | -- Cas ne se présentant pas, donc ne pas traiter
    |     |      |       |       || EEEE | 44444 | 55555 | ..... ||      |       |       |       | On ignore les autres numéros. |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  6  | FFFF | 11111 | 22222 || FFFF | 11111 | 22222 | ..... || .... | ..... | ..... | ..... | Pas de reconduction car       | -- OK
    |     |      |       |       ||      |       |       |       ||      |       |       |       | identique.                    |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  7  | GGGG | 11111 | 22222 || GGGG | 22222 | 33333 | ..... || GGGG | 22222 | 33333 | ..... | Correction : soit choix 1     | -- Choix 1
    |     |      |       |       ||      |       |       |       ||      | 33333 | 22222 |       | Soit Choix 2                  | -- Choix 2
    +-----+------+-------+-------++------+-------+-------+-------++------+-------+-------+-------+-------------------------------+
    |  8  | ZZZZ | 11111 | ..... || ZZZZ | 22222 | ..... | ..... || ZZZZ | 2222  | ..... | ..... | Correction                    |
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
     
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    |  9  | HHHH | 11111 | 22222 || HHHH | 22222 | 11111 | ..... || .... | ..... | ..... | ..... | Pas de reconduction OU BIEN   |  
    |     |      |       |       ||      |       |       |       || HHHH | 22222 | 11111 |       | récupération Annuaire 2       |
    +-----+------+-------+-------++------+-------+-------+-------++------+-------+-------+-------+-------------------------------+
    | 10  | IIII | 11111 | ..... || IIII | ..... | 11111 | ..... || .... | ..... | ..... | ..... | Pas de reconduction           |  
    +-----+------+-------+-------++------+-------+-------+-------++------+-------+-------+-------+-------------------------------+
    | 11  | JJJJ | ..... | ..... || JJJJ | ..... | ..... | ..... || JJJJ | 11111 | ..... | ..... | Reconduction de la            |
    |     |      |       |       || JJJJ | 11111 | ..... | ..... || .... | ..... | ..... | ..... | 2ème occurence                |  
    +-----+------+-------+-------++------+-------+-------+-------++------+-------+-------+-------+-------------------------------+
    | 12  | KKKK | 11111 | ..... || KKKK | ..... | ..... | ..... || .... | ..... | ..... | ..... | Pas de reconduction           |
    |     |      |       |       || KKKK | ..... | 11111 | ..... || .... | ..... | ..... | ..... |                               |  
    +=====+======+=======+=======++======+=======+=======+=======++======+=======+=======+=======+===============================+
    Voila, j'ai corrigé ton cas n°7, et ajouté des cas que tu n'avais pas évoqué, et que je peux rencontrer.
    Je pense (j'espère) ne rien avoir oublié.

    (très bonne idée de faire ce tableau, ça rend les choses bien plus lisibles)

  20. #20
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 378
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 378
    Points : 19 054
    Points
    19 054
    Par défaut
    Salut eveanne.

    C'est le cas numéro 7) qui me pose le plus de problème !!!

    D'après ce que j'ai compris, c'est le cas des numéros qui deviennent obsolètes.
    Le numéro '11111' de botin_a1 n'est pas présent dans 'botin_a2', donc il est devenu obsolète.
    Mais on sait qu'il est obsolète car un nouveau numéro '33333' présent dans botin_a2 n'est pas présent dans botin_a1.
    La seule solution possible est de fournir tous les numéros venant de 'botin_a2', pour ce mail.

    J'ai trouvé une solution qui devrait correspondre à tes attentes.
    En tout cas, cela correspond au jeu d'essai qui a été défini dans les tableaux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `botin_A1`
    --------------
     
    --------------
    CREATE TABLE `botin_A1` (
            `mail` CHAR(30)  NOT NULL,
            `tel1` CHAR(10)      NULL DEFAULT NULL,
            `tel2` CHAR(10)      NULL DEFAULT NULL,
            primary key (`mail`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a1` (`mail`,`tel1`,`tel2`) values
      ('AAAAA',  '11111', '22222'),
      ('CCCCC',  DEFAULT, DEFAULT),
      ('DDDDD',  DEFAULT, DEFAULT),
      ('EEEEE',  DEFAULT, DEFAULT),
      ('FFFFF',  '11111', '22222'),
      ('GGGGG',  '11111', '22222'),
      ('ZZZZZ',  '11111', DEFAULT),
      ('HHHHH',  '11111', '22222'),
      ('IIIII',  '11111', DEFAULT),
      ('JJJJJ',  DEFAULT, DEFAULT),
      ('KKKKK',  '11111', DEFAULT)
    --------------
     
    --------------
    select * from botin_a1
    --------------
     
    +-------+-------+-------+
    | mail  | tel1  | tel2  |
    +-------+-------+-------+
    | AAAAA | 11111 | 22222 |
    | CCCCC | NULL  | NULL  |
    | DDDDD | NULL  | NULL  |
    | EEEEE | NULL  | NULL  |
    | FFFFF | 11111 | 22222 |
    | GGGGG | 11111 | 22222 |
    | HHHHH | 11111 | 22222 |
    | IIIII | 11111 | NULL  |
    | JJJJJ | NULL  | NULL  |
    | KKKKK | 11111 | NULL  |
    | ZZZZZ | 11111 | NULL  |
    +-------+-------+-------+
    --------------
    DROP TABLE IF EXISTS `botin_A2`
    --------------
     
    --------------
    CREATE TABLE `botin_a2` (
            `id`    INT UNSIGNED  NOT NULL AUTO_INCREMENT,
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL,
            primary key (`id`,`mail`),
            UNIQUE INDEX (`id`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_a2` (`mail`,`tel1`,`tel2`,`tel3`) values
      ('BBBBB', '11111', default, default),
      ('CCCCC', '11111', '22222', '33333'),
      ('DDDDD', '11111', default, default),
      ('DDDDD', '22222', default, default),
      ('DDDDD', '33333', default, default),
      ('EEEEE', '11111', default, '22222'),
      ('EEEEE', '33333', default, default),
      ('EEEEE', '44444', '55555', default),
      ('FFFFF', '11111', '22222', default),
      ('GGGGG', '22222', '33333', default),
      ('ZZZZZ', '22222', default, default),
      ('HHHHH', '22222', '11111', default),
      ('IIIII', default, '11111', default),
      ('JJJJJ', default, default, default),
      ('JJJJJ', default, default, default),
      ('JJJJJ', default, default, default),
      ('JJJJJ', default, default, default),
      ('JJJJJ', default, default, default),
      ('JJJJJ', default, default, '11111'),
      ('KKKKK', default, default, default),
      ('KKKKK', default, default, default),
      ('KKKKK', default, default, default),
      ('KKKKK', default, default, default),
      ('KKKKK', default, default, '11111')
    --------------
     
    --------------
    select * from botin_a2
    --------------
     
    +----+-------+-------+-------+-------+
    | id | mail  | tel1  | tel2  | tel3  |
    +----+-------+-------+-------+-------+
    |  1 | BBBBB | 11111 | NULL  | NULL  |
    |  2 | CCCCC | 11111 | 22222 | 33333 |
    |  3 | DDDDD | 11111 | NULL  | NULL  |
    |  4 | DDDDD | 22222 | NULL  | NULL  |
    |  5 | DDDDD | 33333 | NULL  | NULL  |
    |  6 | EEEEE | 11111 | NULL  | 22222 |
    |  7 | EEEEE | 33333 | NULL  | NULL  |
    |  8 | EEEEE | 44444 | 55555 | NULL  |
    |  9 | FFFFF | 11111 | 22222 | NULL  |
    | 10 | GGGGG | 22222 | 33333 | NULL  |
    | 11 | ZZZZZ | 22222 | NULL  | NULL  |
    | 12 | HHHHH | 22222 | 11111 | NULL  |
    | 13 | IIIII | NULL  | 11111 | NULL  |
    | 14 | JJJJJ | NULL  | NULL  | NULL  |
    | 15 | JJJJJ | NULL  | NULL  | NULL  |
    | 16 | JJJJJ | NULL  | NULL  | NULL  |
    | 17 | JJJJJ | NULL  | NULL  | NULL  |
    | 18 | JJJJJ | NULL  | NULL  | NULL  |
    | 19 | JJJJJ | NULL  | NULL  | 11111 |
    | 20 | KKKKK | NULL  | NULL  | NULL  |
    | 21 | KKKKK | NULL  | NULL  | NULL  |
    | 22 | KKKKK | NULL  | NULL  | NULL  |
    | 23 | KKKKK | NULL  | NULL  | NULL  |
    | 24 | KKKKK | NULL  | NULL  | 11111 |
    +----+-------+-------+-------+-------+
    --------------
    DROP TABLE IF EXISTS `botin_temp`
    --------------
     
    --------------
    CREATE TABLE `botin_temp` (
      `mail`  char(30)     NOT NULL,
      `tel`   char(10)         NULL DEFAULT NULL,
      primary key (`mail`,`tel`)
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `botin_temp` (`mail`,`tel`)
                                  select mail, tel1 as tel from botin_a2 as t2 where                         tel1 is not null
          and       exists (      select mail              from botin_a1 as t1 where t2.mail = t1.mail)
          and (tel1 not in (      select       tel1 as tel from botin_a1 as t1 where t2.mail = t1.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t1 where t2.mail = t1.mail  and  tel2 is not null)
          or  (tel1 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)
          or   tel2 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)
          or   tel3 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)))
     
    union                         select mail, tel2 as tel from botin_a2 as t2 where                         tel2 is not null
          and       exists (      select mail              from botin_a1 as t1 where t2.mail = t1.mail)
          and (tel2 not in (      select       tel1 as tel from botin_a1 as t1 where t2.mail = t1.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t1 where t2.mail = t1.mail  and  tel2 is not null)
          or  (tel1 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)
          or   tel2 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)
          or   tel3 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)))
     
    union                         select mail, tel3 as tel from botin_a2 as t2 where                         tel3 is not null
          and       exists (      select mail              from botin_a1 as t1 where t2.mail = t1.mail)
          and (tel3 not in (      select       tel1 as tel from botin_a1 as t1 where t2.mail = t1.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t1 where t2.mail = t1.mail  and  tel2 is not null)
          or  (tel1 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)
          or   tel2 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)
          or   tel3 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)))
    --------------
     
    --------------
    select * from botin_temp
    --------------
     
    +-------+-------+
    | mail  | tel   |
    +-------+-------+
    | CCCCC | 11111 |
    | CCCCC | 22222 |
    | CCCCC | 33333 |
    | DDDDD | 11111 |
    | DDDDD | 22222 |
    | DDDDD | 33333 |
    | EEEEE | 11111 |
    | EEEEE | 22222 |
    | EEEEE | 33333 |
    | EEEEE | 44444 |
    | EEEEE | 55555 |
    | GGGGG | 22222 |
    | GGGGG | 33333 |
    | JJJJJ | 11111 |
    | ZZZZZ | 22222 |
    +-------+-------+
    --------------
    DROP TABLE IF EXISTS `botin_final`
    --------------
     
    --------------
    CREATE TABLE `botin_final` (
            `mail`  CHAR(30)  NOT NULL,
            `tel1`  CHAR(10)      NULL DEFAULT NULL,
            `tel2`  CHAR(10)      NULL DEFAULT NULL,
            `tel3`  CHAR(10)      NULL DEFAULT NULL
    )       ENGINE=InnoDB
            DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
            ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP PROCEDURE IF EXISTS `remplir`
    --------------
     
    --------------
    CREATE PROCEDURE `remplir`()
    BEGIN
    DECLARE _rupt   CHAR(30);
     
    DECLARE _clef   CHAR(30);
    DECLARE _tel    CHAR(10);
     
    DECLARE _mail   CHAR(30);
    DECLARE _tel1   CHAR(10) DEFAULT NULL;
    DECLARE _tel2   CHAR(10) DEFAULT NULL;
    DECLARE _tel3   CHAR(10) DEFAULT NULL;
     
    DECLARE _fin INTEGER DEFAULT 1;
    DECLARE _tab CURSOR FOR SELECT mail, tel from botin_temp order by mail, tel;
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET _fin = 0;
     
    OPEN _tab;
    FETCH _tab INTO _clef, _tel;
    SET _rupt = _clef;
     
    WHILE (_fin)
    DO
      if (_rupt = _clef) then
        SET _mail = _clef;
     
        if     (_tel1 is null) then SET _tel1 = _tel;
        elseif (_tel2 is null) then SET _tel2 = _tel;
        elseif (_tel3 is null) then SET _tel3 = _tel;
        end if;
      else
        insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
        SET _mail = _clef;
        SET _tel1 = _tel;
        SET _tel2 = null;
        SET _tel3 = null;
        SET _rupt = _clef;
      end if;
     
      FETCH _tab INTO _clef, _tel;
    END WHILE;
     
    insert into `botin_final` (`mail`, `tel1`, `tel2`, `tel3`) values (_mail, _tel1, _tel2, _tel3);
     
    CLOSE _tab;
    END
    --------------
     
    --------------
    COMMIT
    --------------
     
    --------------
    call remplir()
    --------------
     
    --------------
    select * from botin_final
    --------------
     
    +-------+-------+-------+-------+
    | mail  | tel1  | tel2  | tel3  |
    +-------+-------+-------+-------+
    | CCCCC | 11111 | 22222 | 33333 |
    | DDDDD | 11111 | 22222 | 33333 |
    | EEEEE | 11111 | 22222 | 33333 |
    | GGGGG | 22222 | 33333 | NULL  |
    | JJJJJ | 11111 | NULL  | NULL  |
    | ZZZZZ | 22222 | NULL  | NULL  |
    +-------+-------+-------+-------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    L'insert se décompose en trois partie car il y a trois numéros de téléphone dans le botin_a2.
    A chaque fois le traitement est pareil :

    1) on récupère le numéro de téléphone si et seulement s'il existe, c'est-à-dire différent de NULL.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                                        select mail, tel1 as tel from botin_a2 as t2 where                         tel1 is not null
    2) on traite les lignes de botin_a1 et botin_a2 si et seulement si elles ont le même 'mail'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
                and       exists (      select mail              from botin_a1 as t1 where t2.mail = t1.mail)
    3) un même numéro présent dans les deux tables n'est pas reconduit, sinon il l'est.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
          and (tel1 not in (      select       tel1 as tel from botin_a1 as t1 where t2.mail = t1.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t1 where t2.mail = t1.mail  and  tel2 is not null)
    4) un numéro présent dans botin_a2 mais absent dans botin_a1 provoque la reconduction de tous les numéros de botin_a2 (toujours pour le même mail).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
          or  (tel1 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)
          or   tel2 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)
          or   tel3 not in (      select       tel1 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel1 is not null
                            union select       tel2 as tel from botin_a1 as t3 where t2.mail = t3.mail  and  tel2 is not null)))
    C'est cette partie 4) qui correspond au cas numéro 7) !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Réponses: 7
    Dernier message: 15/09/2016, 08h50
  2. passage d'un nom de table dans une procédure stockée
    Par thierry V dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 26/07/2010, 16h48
  3. Problème de longueur de requête dans une procédure stockée
    Par doudou_rennes dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/03/2007, 16h39
  4. Réponses: 4
    Dernier message: 16/12/2005, 16h25
  5. Transformation de date dans une procédure stockée
    Par bd0606 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 27/10/2003, 11h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo