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 :

Jointure Multiple: Syntaxe


Sujet :

Langage SQL

  1. #1
    Invité
    Invité(e)
    Par défaut Jointure Multiple: Syntaxe
    Bonsoir,

    J'ai dans mon travail, régulièrement besoin de rédiger des requêtes, et j'ai souvent besoin d'utiliser des LEFT OUTER JOIN, et lorsque je dois en mettre en place sur plusieurs tables, je me pose toujours la question de comment je dois rédiger ma requête. Je vais pour le moment vous montrer deux images qui traduisent deux cas:



    Cas 1:



    Ici, les tables B et C ont pour clé primaire une clé de A. Je souhaite récupérer une ligne pour chaque valeur de A même si la table de B et C ne renvoie rien, donc LEFT OUTER JOIN.
    C'est pourquoi je ferais ma jointure de la manière suivante.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM A
    LEFT OUTER JOIN B
    ON A. ... = B. ...
    LEFT OUTER JOIN C
    ON A. ... = C. ...
    Quand je vois un truc pareille, je lis ça de la manière suivante, A LEFT OUTER JOIN B et A LEFT OUTER JOIN C, car la table A est dans le FROM. Je ne sais pas si je fais de bien de voir cela comme ça, le fait est que du coup je ne vois comment rédiger ma requête si je suis dans le cas 2...



    Cas 2:



    Dans ce cas pareille, je souhaite récupérer une ligne pour chaque valeur dans A même si B ne renvoie rien, et de même récupérer une ligne pour chaque valeur dans B même si C ne renvoie rien. Je fais donc deux LEFT OUTER JOIN, la où ça coince, c'est que je ne vois pas comment gérer ce cas.


    En faite je crois que ce qui me pose notamment problème, c'est que dans un LEFT OUTER JOIN on prends une ligne pour chaque valeur de la table à gauche, mais à quoi correspond la table de gauche? Celle qu'on a mis au début dans le FROM (comme dans mon code du cas 1?), ou la table de gauche dans le ON?



    Je m'excuse par avance si je n'emploie pas les thermes exactes, si je fais des raccourcis et si je n'ai pas été clair. Je suis loin d'avoir une grande expertise en SQL mais je ne demande qu'à apprendre et qu'on me reprenne partout ou j'ai pu me tromper !

    Merci d'avance

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    De gauche dans le sens de lecture des tables...puisque que le ON s'écrit après l'opérateur de jointure....

    Autrement dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM T1
         LEFT OUTER JOIN T2
               ON T1.? = T2.?
              LEFT OUTER JOIN T3
                   ON T2.? = T3.?
    est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM T1
         LEFT OUTER JOIN T2
              LEFT OUTER JOIN T3
               ON T1.? = T2.?
                   ON T2.? = T3.?
    ou encore :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM T1
         LEFT OUTER JOIN T2
              LEFT OUTER JOIN T3
                   ON T2.? = T3.?
               ON T1.? = T2.?
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Invité
    Invité(e)
    Par défaut
    Excuse moi mais j'arrive pas à te suivre, les 3 requêtes que tu m'as envoyer sont d'accord identique, mais corresponde à quel cas, le 1 ou le 2?
    D'ailleurs, est ce que ma requête est bien correct pour le cas 1?

    Tes 3 requêtes colleraient plus au cas 2 si je comprends bien ce que tu as écris, mais tu as dis que ça se lisait dans le sens de lecture des tables, mais il n'y a que le ON qui change par rapport à ce que j'ai envoyé.
    Donc en faite, quand tu dis "dans le sens de lecture des tables"... tu veux parler dans le ON?

    Finalement la table que l'on met en face du FROM n'a pas plus d'importance? Ni même l'ordre dans lequel on écris ses LEFT OUTER JOIN.
    Quelque soit l'agencement que l'on fait ça va marcher tant que l'on garde bien le sens dans le ON?

    EDIT: Je viens de relire un cours, c'est un peu plus clair, mais ya quelques questions que je me pose encore, je refais un post sous peu et je présente le cas précis avec nom de table et tout qui me pose soucis, ça ira plus vite.
    Dernière modification par Invité ; 19/06/2013 à 16h42.

  4. #4
    Invité
    Invité(e)
    Par défaut


    Voici un schémas succint des tables que je souhaite attaquer.
    Chaque no_outil correspond à un no_art et je souhaite récupérer une ligne pour chaque no_art de la table bas_art même si je n'ai rien qui y correspond dans la table pro_ofoutil.
    De même, je souhaite récupérer une ligne pour chaque no_of et ord_oper de la table pro_ofoutil même si cela ne renvoie rien dans la table pro_ofop.

    Voici donc la requête que j'ai faite et cette dernière ne fonctionne pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT bas_art.no_art, bas_art.design1, bas_art.design2, pro_ofoutil.no_of, sum(pro_ofop.qtefab)
    FROM pro_ofoutil
    RIGHT OUTER JOIN bas_art
    ON pro_ofoutil.no_outil = bas_art.no_art
    LEFT OUTER JOIN pro_ofop
    ON pro_ofoutil.no_of = pro_ofop.no_of
    AND pro_ofoutil.ord_oper = pro_ofop.ord_oper
    WHERE bas_art.efface = 0

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Il faut sortir la condition bas_art.efface = 0 de la clause WHERE, et la mettre dans la jointure.
    Sinon la jointure externe devient de fait une jointure interne.

    Tatayo.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Oh punaise ça fait deux jours que je suis dessus et la ça marche !!!

    Va vraiment falloir que je me mette au SQL...

    Donc si je comprends bien, pas de WHERE lors qu'on fait des jointures externes, ou tout du moins sur les tables concernés par cette jointure, c'est bien cela?

    Je me permet de poser une dernière question, mais si je cherchais à joindre une 4ème table à une table autre que pro_ofoutil, toujours en jointure externe, il faudrait que je joue de parenthèse ?

Discussions similaires

  1. jointures multiples - MySQL - syntaxe
    Par Locus51 dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/04/2010, 19h04
  2. [SQL 2000] Optimisation requête avec jointure multiple
    Par zooffy dans le forum Développement
    Réponses: 5
    Dernier message: 18/09/2007, 15h38
  3. Jointures multiples dans requête
    Par SdenS dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 06/03/2007, 15h15
  4. [PostGre SQL] Jointure multiples impossible
    Par Montaigne dans le forum Langage SQL
    Réponses: 8
    Dernier message: 27/04/2006, 10h20
  5. problème requête à jointure multiple...
    Par Ricardo_Tubbs dans le forum Access
    Réponses: 6
    Dernier message: 09/02/2006, 16h45

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