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 :

LEFT OUTER JOIN


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 92
    Points
    92
    Par défaut LEFT OUTER JOIN
    Bonjour,

    Malgré le titre de cette discussion, je n'ai pas voulu rentrer dans celle de dam28800
    car elle est assez spécifique.

    J’ai une question bête :

    Avec une requête comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TJ1.COL1, TJ1.COL2
           FROM   TEST_JOIN1 TJ1
                  LEFT OUTER JOIN TEST_JOIN2 TJ2
                     ON TJ1.COL1 = TJ2.COL1 AND TJ1.COL2 = 'AA'
    On recherche toutes les valeurs satisfaisant la condition de jointure précisée dans prédicat, puis on rajoute toutes les lignes de la table TJ1 (gauche) qui n'ont pas été prises en compte au titre de la satisfaction du critère.

    S’il n’y a rien d’autre : pas de clause WHERE, pas de ORDER
    Avec récupération de colonnes QUE sur la table de gauche

    Et si j’ai bien compris
    Cela revient au même d’attaquer directement TJ1 car on récupère TOUT TJ1
    (enfin pour les colonnes sélectionnées)

    Je me trompe ?
    Sinon, en dehors du WHERE y a-t-il d’autres cas où ne récupère pas TOUT TJ1 ?


    Pour info voici ce que rend la requête suivante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT TJ1.COL1, TJ1.COL2, TJ2.COL1, TJ2.COL2
           FROM   TEST_JOIN1 TJ1
                  LEFT OUTER JOIN TEST_JOIN2 TJ2
                       ON TJ1.COL1 = TJ2.COL1 AND TJ1.COL2 = 'AA'
     
                COL1        COL2 COL1        COL2 
                ----------- ---- ----------- ---- 
                101         AA     101           AA
                102         AA     102           AA
                103         BB     NULL          NULL

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    La restriction s'appliquant à la table T1, il n'y a pas de raison de la placer dans les conditions de jointure. Il faudrait la placer dans la clause WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT TJ1.COL1, TJ1.COL2
    FROM   TEST_JOIN1 TJ1
           LEFT OUTER JOIN TEST_JOIN2 TJ2
                     ON TJ1.COL1 = TJ2.COL1 
    WHERE TJ1.COL2 = 'AA'

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 92
    Points
    92
    Par défaut left outer join
    bonjour,

    ce n'est qu'une discussion d'école
    dans la requête il n'y a pas de where

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Il y a bien une restriction sur T1 puisque si l'on retire le LEFT OUTER et sa condition de jointure, on n'a plus le même ensemble de résultat...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TJ1.COL1, TJ1.COL2
    FROM   TEST_JOIN1 TJ1
           -- LEFT OUTER JOIN TEST_JOIN2 TJ2
               -- ON TJ1.COL1 = TJ2.COL1 AND TJ1.COL2 = 'AA'

  5. #5
    Membre expérimenté
    Avatar de jbrasselet
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Mars 2006
    Messages
    1 022
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 022
    Points : 1 413
    Points
    1 413
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT TJ1.COL1, TJ1.COL2, TJ2.COL1, TJ2.COL2
           FROM   TEST_JOIN1 TJ1
                  LEFT OUTER JOIN TEST_JOIN2 TJ2
                       ON TJ1.COL1 = TJ2.COL1 AND TJ1.COL2 = 'AA'
     
                COL1        COL2 COL1        COL2 
                ----------- ---- ----------- ---- 
                101         AA     101           AA
                102         AA     102           AA
                103         BB     NULL          NULL
    Je ne vois pas comment tu peux avoir un tel résultat
    Ce ne serait pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TJ1.COL1, TJ1.COL2, TJ2.COL1, TJ2.COL2
           FROM   TEST_JOIN1 TJ1
                  LEFT OUTER JOIN TEST_JOIN2 TJ2
                       ON TJ1.COL1 = TJ2.COL1 AND TJ2.COL2 = 'AA'
    plutôt?

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Comme l'a dit al1_24, tu mets une restriction dans la condition de jointure, ce que tu ne devrais pas faire.

    Ensuite, ta première requête ne sélectionne que des colonnes de TJ1 et la restriction s'opère aussi sur TJ1 donc la jointure est inutile.
    La bonne requête serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT COL1, COL2
    FROM   TEST_JOIN1
    WHERE COL2 = 'AA'
    La seconde requête devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TJ1.COL1, TJ1.COL2, TJ2.COL1, TJ2.COL2
    FROM TEST_JOIN1 TJ1
    LEFT OUTER JOIN TEST_JOIN2 TJ2 ON TJ1.COL1 = TJ2.COL1
    WHERE TJ1.COL2 = 'AA'
    Et elle ne devrait pas retourner la ligne 103 puisque COL2 = 'BB'

    Avec ta requête, tu demandes les lignes des deux tables qui sont en jointure et pour lesquelles TJ1.COL2 = 'AA' + toutes les autres lignes de TJ1.
    C'est équivalent à demander toutes les lignes de TJ1 et afficher leur correspondance dans TJ2 quand elle existe, ce qui revient à supprimer la restriction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TJ1.COL1, TJ1.COL2, TJ2.COL1, TJ2.COL2
    FROM TEST_JOIN1 TJ1
    LEFT OUTER JOIN TEST_JOIN2 TJ2 ON TJ1.COL1 = TJ2.COL1
    Sinon, en dehors du WHERE y a-t-il d’autres cas où ne récupère pas TOUT TJ1 ?
    Oui avec un INNER JOIN... ou un FROM TJ1 RIGHT OUTER JOIN TJ2 puisque là c'est la table de droite qui retournera toutes ses lignes.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 107
    Points : 92
    Points
    92
    Par défaut
    J’ai :

    Tj1.col1 Tj1.col2 Tj2.col1 Tj2.col2
    101 AA 101 AA
    102 AA 102 AA
    103 BB 201 BB

    Avec
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT TJ1.COL1, TJ1.COL2, TJ2.COL1, TJ2.COL2
           FROM   TEST_JOIN1 TJ1
                  LEFT OUTER JOIN TEST_JOIN2 TJ2
                       ON TJ1.COL1 = TJ2.COL1 AND TJ1.COL2 = 'AA'

    On joint bien les lignes 101-AA et 102-AA
    (ici TJ1.COL2= ‘AA’ sert à rien)
    Comme il s’agit d’un "LEFT OUTER"
    On récupère la ligne de TJ1 sans correspondance : 103-BB
    Donc le résultat est correct.

    Si à la place de TJ1.COL2 = 'AA'
    Je mets TJ2.COL2 = 'AA'
    J’arrive alors au même résultat, non ?

    Donc sauf si j’ai rien compris
    Il y a des requêtes qui peuvent être complexes et qui
    Ne servent à rien.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Voir ma réponse ci-dessus où j'explique que ta requête est équivalente à une simple jointure gauche sans restriction sur TJ1.COL2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TJ1.COL1, TJ1.COL2, TJ2.COL1, TJ2.COL2
    FROM TEST_JOIN1 TJ1
    LEFT OUTER JOIN TEST_JOIN2 TJ2 ON TJ1.COL1 = TJ2.COL1

Discussions similaires

  1. Probleme de NULL avec LEFT OUTER JOIN
    Par jiluc dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/01/2006, 14h42
  2. Bug LEFT OUTER JOIN Firebird
    Par Fabio2000 dans le forum SQL
    Réponses: 3
    Dernier message: 21/11/2005, 09h08
  3. Problème avec left outer join
    Par jgfa9 dans le forum Requêtes
    Réponses: 1
    Dernier message: 22/08/2005, 21h07
  4. Problème de performance avec LEFT OUTER JOIN
    Par jgfa9 dans le forum Requêtes
    Réponses: 6
    Dernier message: 17/07/2005, 13h17
  5. concatenation de chaine dans un left outer join
    Par the_edge dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/11/2004, 16h08

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