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 :

[Hôtel SQL Pro] Requête PostgreSQL LEFT OUTER


Sujet :

Langage SQL

  1. #1
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut [Hôtel SQL Pro] Requête PostgreSQL LEFT OUTER
    Bonjour,

    Dans les cours de SqlPro , il y a une partie consacré au LEFT OUTER JOIN, avec notamment la requête suivante :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT C.CLI_NOM, T.TEL_NUMERO 
    FROM   T_CLIENT AS C 
           LEFT OUTER JOIN T_TELEPHONE AS T 
                ON C.CLI_ID = T.CLI_ID 
    WHERE  T.TYP_CODE = 'FAX' 
    ORDER BY C.CLI_NOM

    Or en PostgreSQL pour obtenir le résulta voulu il faut mettre le prédicat dans la condition de jointure comme ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT C.CLI_NOM, T.TEL_NUMERO 
    FROM   T_CLIENT AS C 
           LEFT OUTER JOIN T_TELEPHONE AS T 
                ON C.CLI_ID = T.CLI_ID AND  T.TYP_CODE = 'FAX' 
    ORDER BY C.CLI_NOM

    Existe-t-il une réponse logique à cela, ou ai-je louper un épisode.

    Merci de vos lumières.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Aucune explication logique à mon avis, sinon une coquille (pour ne pas dire une erreur)
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Effectivement, comme je l'explique dans mon blog, la requête de SQLPro comporte en fait une jointure interne !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 496
    Points : 12 596
    Points
    12 596
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Effectivement, comme je l'explique dans mon blog, la requête de SQLPro comporte en fait une jointure interne !
    Ta as essayé ton exemple sur quel DB ?, peut-être que certain moteur palie ?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Parmi les SGBD que j'ai pratiqué (Oracle, SQL-Server, Sybase), ça fonctionne ainsi.
    La lecture régulière du forum me faire dire que c'est pareil chez PostGreSQL ainsi que MySQL.

    C'est tout à fait normal et expliqué dans le blog de Cinephil, peut-être pas assez mis en évidence.

    Si je reprends son exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT A.idA, A.valA, B.idB, B.valB, B.booleen 
      FROM A 
           LEFT OUTER JOIN B
             ON B.idA = A.idA;
     
    idA, valA  , idB , valB  , booleen
    1  , 'toto', NULL, NULL  , NULL
    2  , 'titi', 1   , 'riri', 0
    3  , 'tata', 2   , 'fifi', 1
    En rajoutant le filtre WHERE B.booleen = 1, on voit bien que seule la troisième ligne répond à ce critère.

    En fait, vous demandez à ce qu'un élément de B soit forcément non-nul, la jointure externe n'a plus de sens et le résultat devient le même qu'avec une jointure forte.

  6. #6
    Membre chevronné Avatar de bernard59139
    Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2006
    Messages : 950
    Points : 2 064
    Points
    2 064
    Par défaut
    Bonjour

    je me permet de completer les réponses.
    • ON décrit les critères de jointures
    • WHERE décrit les filtres


    Les 2 requêtes données en exemple par MaitrePylos, ne donneront pas un résultat identique, sauf si la table T_TELEPHONE posséde 1 ligne pour chaque CLI_ID.

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par bernard59139 Voir le message
    sauf si la table T_TELEPHONE posséde 1 ligne pour chaque CLI_ID.
    Rien à voir avec le nombre de ligne de la table T_TELEPHONE, c'est juste qu'un filtre (le WHERE) supprime les lignes où TYP_CODE est NULL. Donc le filtre supprime le but de la jointure externe et la transforme en jointure interne.

    A noter que dans l'exemple 13 du chapitre III-C. Les jointures externes, SqlPro écrit bien OR TYP_CODE IS NULL ce qui revient au même que de remonter le filtre dans la clause ON.
    Par contre dans l'exemple 14 la coquille est présente.

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    hmm, pour moi les 2 requêtes renvoient la même chose avec ou sans la condition du where.

    Dans l'exemple 14 il compare un right outer join et un left outer join, ce qui devrait donner le même résultat vu le cas.

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    A noter que dans l'exemple 13 du chapitre III-C. Les jointures externes, SqlPro écrit bien OR TYP_CODE IS NULL ce qui revient au même que de remonter le filtre dans la clause ON.
    C'est un raccourci que je n'emprunterai pas, si cette colonne est déjà remplie de nulls on n'a pas les mêmes résultats.

  10. #10
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    @Punkoff, oui dans l'exemple 14, les 2 requêtes sont identiques mais souffrent chacune de la coquille mentionnée par MaitrePylos.
    A savoir qu'en fait ce ne sont que des jointures internes.

    @Waldar, effectivement si TYP_CODE n'est pas NOT NULL le résultat n'est pas identique, merci.

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Vu la relation entre client et téléphone, non ca ne changera strictement rien de rajouter un "OR TYP_CODE IS NULL".

    Le 1er exemple part sur un right outer join sur la table téléphone qui est en relation :
    client 0,n -------- 1,1 téléphone

    Enfin avec un autre modèle oui je serai d'accord avec toi !

  12. #12
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    bonjour tout le monde;

    Attention, quelque SGBD connait une limite à la jointure externe ; car
    une jointure externe avec une condition sur la meme jointure n'est permise dans SGBD .

    exemple
    pour votre information,une requete de genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.idA, A.valA, B.idB, B.valB, B.booleen 
     FROM A 
     LEFT OUTER JOIN B ON B.idA = A.idA 
      AND B.booleen = 1
    n'est pas autorisée en MsAccess.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  13. #13
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Citation Envoyé par punkoff Voir le message
    un right outer join sur la table téléphone
    Arf, j'avais même pas vu qu'il partait de l'autre côté...

  14. #14
    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 : 60
    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 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par boussafi Voir le message
    bonjour tout le monde;

    Attention, quelque SGBD connait une limite à la jointure externe ; car
    une jointure externe avec une condition sur la meme jointure n'est permise dans SGBD .

    exemple
    pour votre information,une requete de genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.idA, A.valA, B.idB, B.valB, B.booleen 
     FROM A 
     LEFT OUTER JOIN B ON B.idA = A.idA 
      AND B.booleen = 1
    n'est pas autorisée en MsAccess.
    [troll]
    MSAccess est-il un SGBD digne de ce nom ?
    [/TROLL]

    Access à la mauvaise manie d'écrire les joinures en les imbriquant et avec une forêt de parenthèses. Probablement que l'ajout d'une condition de restriction dans la condition de jointure le perturbe.

    Que se passe t-il si je dessine une requête en mode graphique avec une jointure à gauche et une condition de restriction dans la table externe ?
    (je ne me souviens même plus si on peut "dessiner" une jointure externe avec l'interface graphique des requêtes Access !)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [MySQL] Requête & Jointure LEFT OUTER JOIN
    Par MatthieuQ dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/03/2012, 14h22
  2. SQL server 2005 : left outer join
    Par backdraf dans le forum Développement
    Réponses: 3
    Dernier message: 31/05/2011, 18h04
  3. problème requête left outer
    Par KHVince dans le forum Développement
    Réponses: 2
    Dernier message: 30/05/2011, 16h33
  4. left outer join SQL/ODBC
    Par chidalife dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 17/06/2010, 09h49
  5. Requête SQL LEFT OUTER JOIN
    Par dam28800 dans le forum Langage SQL
    Réponses: 42
    Dernier message: 27/02/2009, 14h41

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