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 :

Jointures externes sur une table de jointure [FAQ]


Sujet :

Langage SQL

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Jointures externes sur une table de jointure
    Bonjour,

    Je souhaite savoir s'il est possible d'obtenir à la fois les correspondances et les non correspondances quand on a, entre deux tables, une table de jointure.

    Je m'explique :
    avec un lien 1-n, donc juste 2 tables, je peux facilement obtenir la correspondance et a non correspondance d'enregistrements avec un simple LEFT JOIN ou un RIGHT JOIN.
    Exemple (un peu scolaire :
    1 table theme
    1 table recherche
    1 theme peut posséder plusieurs recherches
    1 recherche ne peut appartenir qu'à un seul thème

    J'ai simplement besoin d'une table theme et d'une table recherche, cette derniere possédant un champ FK pour contenir l'identifiant de la table theme.
    Pour récupérer à la fois les enregistrements en correspondances et en non correspondance, je peux faire :
    SELECT id_recherche FROM recherche LEFT JOIN theme ON id_theme WHERE id_theme=1
    => j'obtiens les recherches qui appartiennent au theme 1 ainsi que celles qui n'appartiennent pas au thème 1

    Maintenant, je change de liaison :
    J'ai une liaison n-n.
    Une recherche peut appartenir à plusieurs thèmes et un thème peut posséder plusieurs recherches.

    J'ai donc une table de jointure qui va réunir comme champ pour former la clé primaire l'identifiant de la table theme et l'identifiant de la table recherche.

    Question : comment obtenir dans ce cas les recherches associées et non associées à un thème donné en une seule requête ?

    Avez-vous déjà rencontré ce cas ?

    Merci pour votre aide, n'hésitez pas si ce n'est pas assez précis/compréhensible.

    Martin

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut, et bienvenue sur ce forum,

    Je ne suis pas bien sûr d'avoir compris ...

    Voici une base de travail (un 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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    CREATE TABLE Recherche (
    Id   NUMBER (10),
    Libe VARCHAR2 (8));
     
    CREATE TABLE Theme (
    Id   NUMBER (10),
    Libe VARCHAR2 (8));
     
    CREATE TABLE Lien (
    Id_Rech NUMBER (10),
    Id_Them NUMBER (10));
     
    INSERT INTO Recherche VALUES (1, 'R1');
    INSERT INTO Recherche VALUES (2, 'R2');
    INSERT INTO Recherche VALUES (3, 'R3');
     
    INSERT INTO Theme VALUES (11, 'T1');
    INSERT INTO Theme VALUES (12, 'T2');
    INSERT INTO Theme VALUES (13, 'T3');
     
    INSERT INTO Lien VALUES (1, 11);
    INSERT INTO Lien VALUES (1, 13);
    INSERT INTO Lien VALUES (2, 11);
    INSERT INTO Lien VALUES (2, 12);
    INSERT INTO Lien VALUES (3, 13);
     
    COMMIT;
    la requête suivante (produit cartésien) te donne toutes les combinsaison possible de couple Recherche-Theme :
    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 R.Libe AS Rech_Libe, T.Libe AS Them_Libe
      2     FROM Recherche R CROSS JOIN Theme T;
     
    RECH_LIB THEM_LIB
    -------- --------
    R1       T1
    R2       T1
    R3       T1
    R1       T2
    R2       T2
    R3       T2
    R1       T3
    R2       T3
    R3       T3
     
    9 ligne(s) sélectionnée(s).
    Tu peut facilement, dans la même requête, rajouter une sous-requête testant la présence du lien :
    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
    17
    18
    SQL> SELECT R.Libe AS Rech_Libe, T.Libe AS Them_Libe,
      2    (SELECT Count(*) FROM Lien
      3      WHERE Id_Rech = R.Id AND Id_Them = T.Id) AS Lien_existe
      4    FROM Recherche R CROSS JOIN Theme T;
     
    RECH_LIB THEM_LIB LIEN_EXISTE
    -------- -------- -----------
    R1       T1                 1
    R2       T1                 1
    R3       T1                 0
    R1       T2                 0
    R2       T2                 1
    R3       T2                 0
    R1       T3                 1
    R2       T3                 0
    R3       T3                 1
     
    9 ligne(s) sélectionnée(s).
    "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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Merci
    C'est exactement ce que je recherchais.

    Merci!

    Martin

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Double jointure externe sur une table
    Par astridette dans le forum SQL
    Réponses: 2
    Dernier message: 30/03/2012, 13h33
  2. [AC-2003] Jointure externe sur une même table
    Par jeff69 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 14/09/2009, 22h11
  3. Jointure externe sur une sous-requête
    Par pgentils dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/01/2008, 09h34
  4. Réponses: 3
    Dernier message: 29/10/2007, 13h04
  5. Jointure externe sur 2 tables
    Par Danae dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/07/2005, 15h37

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