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

  1. #1
    Membre du Club
    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
    Points : 51
    Points
    51
    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 : 294
Taille : 7,4 Ko

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

    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
    Points : 7 740
    Points
    7 740
    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
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre du Club
    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
    Points : 51
    Points
    51
    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 éminent

    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
    Points : 7 740
    Points
    7 740
    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';
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre du Club
    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
    Points : 51
    Points
    51
    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 éminent

    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
    Points : 7 740
    Points
    7 740
    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';
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre du Club
    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
    Points : 51
    Points
    51
    Par défaut
    Ah c'est super! Par contre il me sort plein de résultats identique. comme tu peux le voir ci-dessous:

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)	1332	DL 25-107-035 courbes frictions séries.pdf	1	20140287
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)	1332	DL 25-107-035 courbes frictions séries.pdf	1	20140287
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)	1332	DL 25-107-035 courbes frictions séries.pdf	1	20140287
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)	1332	DL 25-107-035 courbes frictions séries.pdf	1	20140287
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)	1332	DL 25-107-035 courbes frictions séries.pdf	1	20140287
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)	1332	DL 25-107-035 courbes frictions séries.pdf	1	20140287
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)	1278	DL 25-107-035 courbes lot 2014-0290.pdf	1	20140290
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)	1278	DL 25-107-035 courbes lot 2014-0290.pdf	1	20140290
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)	1278	DL 25-107-035 courbes lot 2014-0290.pdf	1	20140290
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)	1278	DL 25-107-035 courbes lot 2014-0290.pdf	1	20140290
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)	1278	DL 25-107-035 courbes lot 2014-0290.pdf	1	20140290
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)	1278	DL 25-107-035 courbes lot 2014-0290.pdf	1	20140290
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    441	1039447 ind 2.pdf	2	409	application/pdf	(BLOB)				
    440	BOM 1039447 ind 2-1.pdf	1	409	application/pdf	(BLOB)
    J'ai essayé avec DISTINCT mais il me sort: ORA-00932: types de données incohérents ; attendu : - ; obtenu : BLOB

  8. #8
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il faut que tu vois ton modèle de données exact avec les clés primaires et de référence, simplifier ta requête pour vérifier avec une table, puis 2, etc...

    Déjà tu peux vérifier les données PK et références de chaque table. Dans ton modèle, la table fichier_livraison n'a pas de PK.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT d.id_dm DM_iddm, b.id_dm LIV_iddm, b.id_livraison LIV_idliv, l.id_livraison Fic_idliv
    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';
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  9. #9
    Membre du Club
    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
    Points : 51
    Points
    51
    Par défaut
    Je suis désolé j'ai pas tout compris de ce que tu m'a dit. Je suis un peu nouveau sur oracle donc si il y a des manipulation délicates à faire je ne saurai pas les réaliser. Par contre ma table POP_FICHIER_LIVRAISON a un clé primaire c'est ID_FICHIER_LIVRAISON.
    J'ai testé avec cette requête: Pour obtenir que les fichier lot selon l'ID_DM
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT LABEL_FICHIER_LOT FROM POP_FICHIER_LOT l, POP_LOT b, POP_FICHIER_DM d
    WHERE l.ID_LOT (+)= b.ID_LOT
    AND  b.ID_DM = d.ID_DM
    AND  d.ID_DM='409';
    Et ça fonctionne plutôt bien malgré le null en 1er résultat (non visible ici):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DL 25-107-035 courbes frictions séries.pdf
    DL 25-107-035 courbes lot 2014-0290.pdf
    Ah oui c'est vrai que je t'ai pas donné tout les champs de mes tables, tu veux que je te donne le schéma complet ?

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