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

Langage SQL Discussion :

Auto jointure (sur une même table)


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut Auto jointure (sur une même table)
    Bonjour,
    J'ai une table Clients contenant 3 colonnes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ClientNumber          ClientName       ParentClientNumber
    11111111               Name1            22222222
    22222222               Name2            44444444
    33333333               Name3            11111111   
    ....
    je voudrais ajouter une colonne (ParentClientName) comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ClientNumber          ClientName       ParentClientNumber      ParentClientName
    11111111               Name1            22222222                   Name2
    22222222               Name2            44444444                   Name4
    33333333               Name3            11111111                   Name1
    ....
    Je pense que c'est une jointure sur la même table CLIENTS qu'il me faut mais je me perds un peu dans le code sql depuis tout à l'heure

    Merci

  2. #2
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 104
    Points
    104
    Par défaut
    Essaye ca

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update clients set ParentClientName = (select c.ClientName from clients c where c.ClientNumber = ParentClientNumber);

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

    Le statement select ne retourne pas le même nombre d'enregistrements.. donc il y a un probléme quelque part..

    ne faut-il pas une jointure??

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    En plus ce select que tu fais retourne simplement les enregistrements où clientnumber est le même que le ParentClientNumber

  5. #5
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Bonjour,

    Quel est l'ordre logique et la correspondance entre tes colonnes existantes et futur ?

    ClientNumber ClientName ParentClientNumber ParentClientName
    11111111 Name1 22222222 Name2
    22222222 Name2 44444444 Name4
    33333333 Name3 11111111 Name1
    ....

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    ParentClientName n'existe pas
    Je voudrais la créer..

    Mais l'important n'est pas la clause update.. c'est la clause select qui m'ennuie..

    Comment récupérer l'information : Nom du client Parent!


    Merci

  7. #7
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 104
    Points
    104
    Par défaut
    Cette requete marche mais il ne faut pas que tu ais plusieurs clients avec le meme clientnumber.

    Sinon effectivement, il ne sait pas lequel prendre

  8. #8
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Autant pour moi, pas bien regardé

    Peut-être une reflexion attive :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE clients SET ParentClientName = (SELECT c.ClientName FROM clients c join clients c1 WHERE c1.ClientNumber = c.ParentClientNumber);
    A voir

  9. #9
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Oui, c'est ce que je fais depuis tout à l'heure (ON à la place de where)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT c.ClientName FROM clients c JOIN clients c1 ON c1.ClientNumber = c.ParentClientNumber
    et j'obtiens plusieurs "duplicate values" .. en plus si je fais un distinct, je n'obtiens pas le même nombre d'enregistrements


    et puis Kirokool..
    les cas où ParentClientNumber est le même que ClientNumber sont trés fréquents (d'ailleurs c'est la régle générale)..
    du coup cette requête n'est pas du tout adaptée...
    et puis je ne peux pas changer les données , si c'est au final ce que tu me proposes ..

  10. #10
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 104
    Points
    104
    Par défaut
    tu te prend la tete.

    Il faut que tu laisse le update et fasse ton test d'égalité avec la table de l'update (comme ce que j'ai fait). Mais comme je t'ai dit, tu dois avoir plusieurs clients avec le meme clientnumber et c'est ca qui fait que tu as trop de valeurs.

    Donc au pire tu prend le max clientname, mais je ne sais pas si cela solutionne ton problème.

    Ca fait donc si tu as des clientnumber uniques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE clients c1 SET ParentClientName = (SELECT c.ClientName FROM clients c WHERE c.ClientNumber = c1.ParentClientNumber);
    Et si tu ne sais pas lequel choisir (je pense que c'est ca qu'il te faut) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE clients c1 SET ParentClientName = (SELECT max(c.ClientName) FROM clients c WHERE c.ClientNumber = c1.ParentClientNumber);

  11. #11
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Autant pour moi mais je ne crois pas que tu l'ai mentionné précisement ...

  12. #12
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Pourtant le principe est simple :

    Avoir le nom correspondant au nombre dans la même table (indépendemment du reste) .. sachant que les nombres sont uniques (BIENSUR)

    C'est le principe même de l'auto jointure.. mais je n'arrive toujours pas à avoir le même nombre d'enregistrements..


    et ça me tue que vous ne compreniez pas le post car j'ai bien expliqué le probléme pourtant (priére d'oublier la clause update)

  13. #13
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Ok Kiroukool .. je te suis

    J'ai effectivement plusieurs lignes dans ma table avec le meme numéro de client. MAIS, LA PAIRE (NUMBER, NAME) est UNIQUE .. donc la correspondance doit être unique

    j'ai essayé ton code (le update set client c1 génére une erreur de syntaxe)
    et puis si je fais le max sans , cela me donne le max sur toute la table pour toutes les lignes

  14. #14
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ON T1.Num = T2.Num
    AND T1.Nom = T2.Nom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE T1.ParentNum = T2.Num

  15. #15
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    toujours pas

    je ne comprends pas.. t'as testé et ça marche?
    ou bien tu es en train de méditer avec moi

  16. #16
    Modérateur
    Avatar de Chtulus
    Homme Profil pro
    Ingénieur
    Inscrit en
    Avril 2008
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2008
    Messages : 3 094
    Points : 8 678
    Points
    8 678
    Par défaut
    Mon pauvre je médite avec toi, en plus je suis sur un projet très lourd en même temps (Mais comme j'aime bien apprendre), c'est pour ça que des fois j'suis un peu à côté...Désolé pour les questions superflues

    En fait j'ai créé une table comme la tienne pour visualiser et un papier et un crayon...

    Ca marche pas, donc tans pis, on va bien trouver, ça doit être tout bête en plus...

  17. #17
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 112
    Points : 104
    Points
    104
    Par défaut
    Non mais meme si le couple (clientnumber, clientname) est unique, si tu as plusieurs clientname pour un clientnumber, il faut absolument que tu saches lequel tu veux choisir pour faire ton update déja.

    Car dans ton cas tu ne peux pas te baser uniquement sur le numero de client, il faut rajouter une condition : soit prendre le max, soit prendre le min (pour un clientnumber donné), soit utiliser un autre critère qui te renvoie un seul clientname.

Discussions similaires

  1. Jointure sur une même table
    Par JmL40 dans le forum Développement
    Réponses: 6
    Dernier message: 14/12/2010, 15h26
  2. Jointure sur une même table
    Par franquis dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/04/2010, 11h49
  3. Auto-jointure sur une même table
    Par West01 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/10/2008, 15h46
  4. [1.x] Jointure sur une même table
    Par tyx dans le forum Symfony
    Réponses: 1
    Dernier message: 04/08/2008, 11h19
  5. jointure sur une même table
    Par guillaumeVb6 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/09/2004, 15h08

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