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

SQL Oracle Discussion :

Jointure sur plusieurs tables


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 120
    Par défaut Jointure sur plusieurs tables
    Bonjour à tous!!

    J'ai 5 tables (voir schéma sur la photo ci-jointe) dont 3 contiennent des fichiers, je souhaiterai avec un id demande (ici ID_DM) d'obtenir tout les fichiers que contiennent mes 3 tables selon cet ID_DM. Le problème c'est que sur ma table POP_Fichier_DM je n'ai aucun problème puisque j'ai ID_DM dedans mais pour mes 2 autres tables (POP_FICHIER_LIVRAISON et POP_FICHIER_LOT) ID_DM n'existe pas mais je peux passer par deux tables intermédiaires (POP_LOT et POP_LIVRAISON). Ce que je veux faire c'est que avec ID_DM je vais dans la table POP_LIVRAISON et je récupère tout les ID_LIVRAISON qui correspondent à ID_DM puis je vais dans la table POP_FICHIER_LIVRAISON et je récupère les fichiers de cette table grâce aux ID_LIVRAISON. Et idem pour les deux autres tables. Mon schéma sera plus parlant^^.

    J'ai essayé avec les fichiers de la table POP_FICHIER_DM et POP_FICHIER_LIVRAISON mais j'ai eu cette erreur: ORA-00918: définition de colonne ambigu

    Voici ma 1e ébauche de requête:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM POP_FICHIER_DM
    JOIN POP_LIVRAISON ON POP_LIVRAISON.ID_DM = POP_FICHIER_DM.ID_DM
    WHERE ID_DM='409';
    Je n'ai pas pu aller plus loin que la table POP_LIVRAISON à cause de cette erreur. Donc si quelqu'un peux m'aider ça m'arrangerai.
    Merci d'avance


    Nom : BDD_fichier.png
Affichages : 321
Taille : 7,4 Ko

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    C'est ton SELECT *. * dit à oracle de récupérer chaque colonne. Mais si 2 colonnes portent le même nom, oracle sort en erreur. il faut préfixer du nom de la table

    http://ora-00918.ora-code.com/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT * FROM dual, dual
    ORA-00918: column ambiguously DEFINED
     
    SELECT a.*, b.* FROM dual a, dual b
    DUMMY	DUMMY_1
    X	X
     
    SELECT * FROM dual a, dual b
    DUMMY	DUMMY_1
    X	X

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 120
    Par défaut
    Merci de ta réponse, j'ai corrigé le problème mais il me sors une nouvelle erreur: ORA-00904: "D"."ID_DM" : identificateur non valide.
    J'ai regardé ton lien mais je comprends pas pourqioi "ID_DM" ne serai pas valide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT d.*, l.* FROM POP_FICHIER_DM d,POP_FICHIER_LIVRAISON l
    JOIN POP_LIVRAISON ON POP_LIVRAISON.ID_DM = d.ID_DM
    JOIN POP_FICHIER_LIVRAISON ON l.ID_LIVRAISON = POP_LIVRAISON.ID_LIVRAISON
    WHERE ID_DM='409';

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Pourquoi combiner des JOIN et des FROM a, b ? C'est équivalent et peut prêter à confusion

    Bref il faut apprendre à débugguer, car cette ligne est incohérente avec le reste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    JOIN POP_FICHIER_LIVRAISON ON l.ID_LIVRAISON = POP_LIVRAISON.ID_LIVRAISON
    Un join avec une condition non liée à ta table.

    Bref : Simplifier
    exemple (je n'ai pas vérifié les colonnes, c'est juste un reformatage de la requête en virant les trucs inutiles)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT d.*, l.*
    FROM POP_FICHIER_DM d, POP_FICHIER_LIVRAISON l, POP_LIVRAISON b
    WHERE b.ID_DM = d.ID_DM
    AND l.ID_LIVRAISON = b.ID_LIVRAISON
    AND d.ID_DM='409';

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    120
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 120
    Par défaut
    Merci beaucoup la requête fonctionne bien sauf que j'ai un problème, je me suis aperçu que dans ma table POP_FICHIER_LIVRAISON j'ai aucun fichier qui correspond à ID_DM (en passant par ma table POP_LIVRAISON pour avoir ID_LIVRAISON) et donc la requête me renvoi aucun résultat alors que dans POP_FICHIER_DM j'ai des fichier qui correspondent à ID_DM. Donc n'y a t'il pas un moyen au travers de cette requête d'avoir quand même tout les fichiers même si il n'y en a pas dans un table ?

    voici ma requête final:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT d.*, l.*
    FROM POP_FICHIER_DM d, POP_FICHIER_LOT l, POP_LOT b, POP_FICHIER_LIVRAISON fliv, POP_LIVRAISON liv
    WHERE b.ID_DM = d.ID_DM
    AND liv.ID_DM= d.ID_DM
    AND fliv.ID_LIVRAISON= liv.ID_LIVRAISON
    AND l.ID_LOT = b.ID_LOT
    AND d.ID_DM='409';

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Jointure Externe (fonctionnalité spécifique Oracle) ou OUTER JOIN (en SQL ANSI)

    Exemple en spécificité Oracle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT d.*, l.*
    FROM POP_FICHIER_DM d, POP_FICHIER_LIVRAISON l, POP_LIVRAISON b
    WHERE b.ID_DM = d.ID_DM
    AND l.ID_LIVRAISON (+)= b.ID_LIVRAISON
    AND d.ID_DM='409';

Discussions similaires

  1. Problème de jointure sur plusieurs tables
    Par papouuu dans le forum Langage SQL
    Réponses: 1
    Dernier message: 25/01/2011, 14h02
  2. [AC-2007] Jointure sur plusieurs tables
    Par Steph0 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 20/01/2011, 08h24
  3. jointure sur plusieurs tables fonctionne pas
    Par jmsch dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/11/2010, 21h55
  4. Jointures sur plusieurs tables
    Par Daibai dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/12/2009, 09h55
  5. hibernate-criteria : jointure sur plusieurs tables
    Par loic72 dans le forum Hibernate
    Réponses: 9
    Dernier message: 24/09/2007, 17h27

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