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 sur TROIS tables


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 52
    Points : 43
    Points
    43
    Par défaut jointure sur TROIS tables
    bonjour
    je me retrouve avec un pb donné: je suis sous Oracle 8i

    si j'ai deux tables A et B qui ne contiennent qu'un champ nom (je simplifie le problème AU MAXIMUM)
    et je veux les infos de A et de B sous la forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      A     B
    nom1  nom1  // info présente dans les deux tables
    nom2        // info présente dans la table A seulement
    nom3  nom3  // info présente dans les deux tables
          nom4  // info présente dans la table B seulement

    mon code est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select A.nom, B.nom
    from 
    (select A.nom
     from A
     group by nom) A
    ,
    (select B.nom
     from B
     group by nom) B
    where A.nom (+) = B.nom
    order by A.nom, B.nom;
    et ça marche bien

    par contre si je veux avoir la même chose avec trois tables
    ex
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
      A     B   C
    nom1  nom1 nom1  // info présente dans les trois tables
    nom2       nom2  // info présente dans les table A et C seulement
    nom3  nom3       // info présente dans les tables A et B seulement
          nom4 nom4  // info présente dans les tables B et C seulement
    nom5             // info présente dans la table A seulement
          nom6       // info présente dans la table B seulement
               nom7  // info présente dans la table C seulement
    je ne trouve pas de code correct

    j'essaye avec un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    where A.nom (+) = B.nom
    and B.nom (+) =C.nom
    and C.nom (+) = A.nom
    mais il me dit
    ORA-01416: two tables cannot be outer-joined to each other
    comment puis-je résoudre ce problème?
    merci
    quand on voit ce qu'on voit et quand on entend ce qu'on entend on a bien raison de penser ce qu'on pense
    Coluche

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM A
    LEFT JOIN B ON A.NOM = B.NOM
    LEFT JOIN C ON B.NOM = C.NOM

  3. #3
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 52
    Points : 43
    Points
    43
    Par défaut merci
    merci pour ta reponse

    mais il me semble (pas sur ) que dans ce cas les infos qui ne sont que dans la table B ne seront pas affichées, non?
    quand on voit ce qu'on voit et quand on entend ce qu'on entend on a bien raison de penser ce qu'on pense
    Coluche

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    faux.

  5. #5
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 52
    Points : 43
    Points
    43
    Par défaut
    en fait je ne suis pas sur l'ordi où je bosse mais il me semble que j'avais essayé et que ça ne marchait pas.
    enfin si tu le dis je te crois!

    encore merci
    quand on voit ce qu'on voit et quand on entend ce qu'on entend on a bien raison de penser ce qu'on pense
    Coluche

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    332
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2002
    Messages : 332
    Points : 502
    Points
    502
    Par défaut
    Tu peux avoir 3 degres d'inclusions:

    ton exemple est exclusif (INNER JOIN)

    mon exemple est inclusif de la gauche (LEFT OUTER JOIN)

    et voici un exemple inclusif total (un produit cartesien)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT *
    FROM A
    FULL JOIN B ON A.nom = B.nom
    FULL JOIN C ON B.nom = C.nom
    En plusieurs annees de metier, je n'ai vu qu'une seule personne utiliser ce type de jointure. Ses structures de base etaient (et doivent toujours etre) pourries. Avant d'avoir recours a ce type de requete, peut-etre vaudrait-il mieux soumettre la structure-meme de la base a des avis exterieurs.

  7. #7
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 52
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Babyneedle
    En plusieurs annees de metier, je n'ai vu qu'une seule personne utiliser ce type de jointure. Ses structures de base etaient (et doivent toujours etre) pourries. Avant d'avoir recours a ce type de requete, peut-etre vaudrait-il mieux soumettre la structure-meme de la base a des avis exterieurs.
    je suis désolée mais je bosse avec les bases qu'on me donne.
    elles existent depuis des années et je fais avec.
    quand on voit ce qu'on voit et quand on entend ce qu'on entend on a bien raison de penser ce qu'on pense
    Coluche

  8. #8
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 074
    Points
    8 074
    Par défaut
    Bonjour

    Voilà une formule qui devrait fonctionner en 8i (testé en 9i) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select A.Nom A, B.Nom B, C.Nom C
    from A, B, C, (select Nom from A 
                   union
                   select Nom from B
                   union
                   select Nom from C) T
    where T.Nom=A.Nom(+)
    and   T.Nom=B.Nom(+)
    and   T.Nom=C.Nom(+)
    order by T.Nom;
    Le principe consiste à créer une vue en ligne nommée T, qui fait l'union de toutes les valeurs figurant dans A, B ou C, et à faire une jointure externe entre cette vue en ligne et les 3 tables considérées.

    Par ailleurs, vous auriez avantage à poser les questions Oracle directement dans le forum Oracle.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  9. #9
    Membre du Club
    Profil pro
    Développeur informatique
    Inscrit en
    Mars 2002
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mars 2002
    Messages : 52
    Points : 43
    Points
    43
    Par défaut
    merci pour votre réponse.

    j'ai posé ma question ici pensant que ce n'etait qu'un problème de requete SQL mais effectivement
    ici le SGBD est important.
    quand on voit ce qu'on voit et quand on entend ce qu'on entend on a bien raison de penser ce qu'on pense
    Coluche

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

Discussions similaires

  1. Jointures sur trois tables
    Par SPKlls dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/11/2008, 17h55
  2. Requete SQL avec jointure sur trois tables
    Par pit2121 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 19/05/2008, 23h07
  3. Requête SQL avec jointure sur trois tables
    Par pit2121 dans le forum SQL
    Réponses: 0
    Dernier message: 19/05/2008, 20h24
  4. Jointure sur trois tables
    Par user126 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 28/02/2008, 17h07
  5. [SQL Server 8] Discussion : Full Jointure sur trois tables
    Par Baquardie dans le forum Langage SQL
    Réponses: 5
    Dernier message: 22/12/2006, 14h01

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