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 externe avec prédicat dans la clause de jointure


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Par défaut Jointure externe avec prédicat dans la clause de jointure
    Bonjour,

    j'ai lu avec intérêt le paragraphe "2.4.3 Discussion sur la jointure externe" du cours SQL http://sqlpro.developpez.com/cours/sqlaz/jointures/ de F. Brouard et je pense avoir compris comment fonctionne la requête suivante :
    SELECT TJ1.COL1, TJ1.COL2
    FROM TEST_JOIN1 TJ1
    LEFT OUTER JOIN TEST_JOIN2 TJ2
    ON TJ1.COL1 = TJ2.COL1 AND TJ1.COL2 = 'AA'

    +------+------+
    | COL1 | COL2 |
    +------+------+
    | 101 | AA |
    | 102 | AA |
    | 103 | BB |
    +------+------+
    Mais je ne comprends pas comment marche la suivante :
    SELECT TJ1.COL1, TJ1.COL2
    FROM TEST_JOIN1 TJ1
    LEFT OUTER JOIN TEST_JOIN2 TJ2
    ON TJ1.COL1 = TJ2.COL1 OR TJ1.COL2 = 'AA'

    +------+------+
    | COL1 | COL2 |
    +------+------+
    | 101 | AA |
    | 101 | AA |
    | 101 | AA |
    | 102 | AA |
    | 102 | AA |
    | 102 | AA |
    | 103 | BB |
    +------+------+
    Peut-être n'a-t'elle aucun sens ? Mais quelle est la logique ? Quelqu'un peut m'expliquer ? Merci d'avance !
    A.

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Par défaut
    bonjour,

    tu fais des jointures entre deux tables, mais tu n'affiches que les colonnes de la premiere table, ca n'a pas de sens.

    en ce qui concerne les jointures left outer join,
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select * from t1 left outer join t2 on condition;
    moi je la décrirais de la facon suivante:
    on affiche tous les enregistrements de la table t1, puis pour les enregistrements de la table t2 qui respectent condition, on affiche leur valeur, sinon on affiche null

    après, que ce soit un and ou un or, peut importe, la condition donne vrai ou faux

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 3
    Par défaut
    Bonjour,

    et merci de ta réponse, mais ma question n'était sans doute pas assez claire : en fait elle est largement dans le titre.
    Pour ce qui est des attributs affichés, j'ai repris les exemples cités qui veulent illustrer la différence de comportement selon que la clause de jointure 'comprend' ou non un fltre.
    Donc, je résume un peu ma question : si je remplace le 'AND' par 'OR' qu'est-ce que cela signifie et comment ça marche ?

    A.

  4. #4
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    D'abord, replacer les choses dans leur contexte et donner le 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
    CREATE TABLE TEST_JOIN1
    (COL1 INT,
     COL2 CHAR(2));
     
    CREATE TABLE TEST_JOIN2
    (COL1 INT,
     COL2 CHAR(2));
     
    INSERT INTO TEST_JOIN1 VALUES (101, 'AA');
    INSERT INTO TEST_JOIN1 VALUES (102, 'AA');
    INSERT INTO TEST_JOIN1 VALUES (103, 'BB');
     
    INSERT INTO TEST_JOIN2 VALUES (101, 'AA');
    INSERT INTO TEST_JOIN2 VALUES (102, 'AA');
    INSERT INTO TEST_JOIN2 VALUES (201, 'BB');
    Pour mieux comprendre, considèrons ta 2° requête, mais en ajoutant le champ TJ2.COL1 : :
    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
    SQL> SELECT TJ1.COL1, TJ1.COL2, TJ2.COL1 AS COL2_1
      2    FROM TEST_JOIN1 TJ1
      3         LEFT OUTER JOIN TEST_JOIN2 TJ2
      4         ON TJ1.COL1 = TJ2.COL1  OR TJ1.COL2 = 'AA';
     
          COL1 CO     COL2_1
    ---------- -- ----------
           101 AA        101
           101 AA        102
           101 AA        201
           102 AA        101
           102 AA        102
           102 AA        201
           103 BB
     
    7 ligne(s) sélectionnée(s).
    Tu fais une requête avec TJ1 et TJ2, tu peux récupérer jusqu'à 9 lignes (via un produit cartésien). Mais tu as une jointure externe, donc une condition à respecter :
    (a) soit TJ1.COL1 = TJ2.COL1
    (b) soit TJ1.COJ2 = 'AA'
    (c) soit pas de correspondance et on affiche tout de même les enregistrements de la table "gauche" TJ1

    Pour les 2 premiers enregistrements de TJ1, la condition (a) de jointure est respectée, donc tu obtiens 3 lignes à chaque fois, vu que la table TJ2 contient 3 enregistrements.
    Pour le 3°, les condition (a) et (b) ne sont pas remplies : mais comme la jointure est externe, on affiche la ligne de TJ1 dans correspondance dans TJ2. Si la jointure avait été interne, on aurait pas eu cette ligne.

    CQFD
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Par défaut
    Citation Envoyé par aflp91
    Pour ce qui est des attributs affichés, j'ai repris les exemples cités qui veulent illustrer la différence de comportement selon que la clause de jointure 'comprend' ou non un fltre.
    oui, mais les exemples affichent les colonnes de TEST_JOIN1 et de TEST_JOIN2 pour justement mettre en valeur le fait que ca affiche des valeurs NULL pour les enregistrements sans correspondance de TEST_JOIN2

    Citation Envoyé par aflp91
    Donc, je résume un peu ma question : si je remplace le 'AND' par 'OR' qu'est-ce que cela signifie et comment ça marche ?
    A.
    Cette question est en dehors des jointures, c'est de la logique.
    il faut prendre l'expression aprés le ON en globalité

    Dans une requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select * from t1 left join t2 on t1.col1 = t2.col2 or t1.col2 = t1.col2;
    l'expression est vrai si col1 de t1 est égale à col1 de t2 ou col2 de t1 est égale à col2 de t2.
    si on remplace le or par and, on remplace le ou par un et.

    désolé si ça te paraissait évident, ca voudra dire que j'ai toujours pas compris ta question.

  6. #6
    Xo
    Xo est déconnecté
    Membre Expert
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Par défaut
    Citation Envoyé par coca25
    Cette question est en dehors des jointures, c'est de la logique.
    il faut prendre l'expression aprés le ON en globalité
    Faux : tu construis tes conditions de jointures avec les conditions que tu veux.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Par défaut
    Citation Envoyé par Xo
    Faux : tu construis tes conditions de jointures avec les conditions que tu veux.
    je vois pas le rapport, c'est jamais dit qu'on était limité.
    ce que je voulais dire c'est que pour:
    on expression
    la correspondance se fera si expression est vrai.
    et pour calculer expression, c'est de la logique comme pour les if en programmation etc... qu'on mette des or ou des and n'y change rien

Discussions similaires

  1. Jointure externe avec clause WHERE
    Par ben53 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 17/03/2008, 08h56
  2. Réponses: 3
    Dernier message: 11/12/2005, 11h15
  3. Réponses: 1
    Dernier message: 09/12/2005, 23h34
  4. [SQL] jointure externe avec 3 tables, comment faire ....
    Par grumbok dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 16h13
  5. jointure externe avec un where, me pose problème!
    Par Danae dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/07/2005, 17h37

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