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 externe (complexe) Sur des clés concaténé


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut jointure externe (complexe) Sur des clés concaténé
    bonjour , DB 9.2 devloper s 10g
    jai un probleme sur une requete:qui utilise des jointure externe sur plusieur tables dont deux contient des clé composé alant jusqu'a 3 attribut par clé.

    les tables :
    CLIENT (num_cli,srevice_cli , nom_cli....)

    COMNDE (num_comd,date_c,num_cli...)

    PIECE (ref_piece,des_piece,qte,seuil...)

    ACHAT_Piec (num_comd pk*fk,des_piece pk*fk,qté_P) -- client piece
    HUILE (code_huile,des_huile,type_hle,qté_h)
    ACHAT_HUILE (num_comd fk*pk,num_huile fk*pk,qte_com)--maint

    PRESTATION (num_prest,des_prest)

    DETAIL_Prest (num_comd pk*fk ,num_prest pk*fk,montant) --pour un client maintenance

    VEH_PREST(n_chass*pk,num_compm fk*pk, des_vehm..) vehicule de la maintennance
    PIECE_PREST(n_chass fk*pk, num_compm fk*pk,num_piece fk*pk,qté_p..)--piece utilisé
    PREST_HUILE(n_chass fk*pk,num_compm fk*pk,num_huile fk*pk, qté_h..)--huile utilisé
    ET VOILA LA REQUETE : probleme : aucuen ligne retourné alors qu'il ya des données
    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
    SELECT s.num_compm,s.n_chass,v.num_prest,t.des_prest prestation,h.des_huil,
    hp.qt_hp,p.des_piec piece,s.qt_pm
    
    FROM PREST_VEH v,COMD_PM c,PRESTATION t,
    PIECE_PREST s,PIECE p,HUILE_PREST hp,HUILE h
    WHERE  v.num_compm =c.NUM_COMPM
    AND   s.N_CHASS =v.N_CHASS
    AND    s.NUM_COMPM=v.NUM_COMPM
    AND   s.NUM_PREST=v.NUM_PREST
    AND   hp.N_CHASS=v.N_CHASS
    AND   hp.NUM_COMPM=v.NUM_COMPM
    AND   hp.NUM_PREST=v.NUM_PREST
    AND  hp.N_CHASS(+)=s.n_chass
    AND   hp.num_compm(+)=s.num_compm
    AND   hp.num_prest(+)=s.NUM_PREST
    AND   v.num_prest=t.NUM_PREST
    AND   s.NUM_PIECE=p.REF_PIEC
    AND   hp.NUM_HL=h.CODE_HUIL
    la jointure externe sur clé concatené ( de 3 attribut) j maitrise pas aparement
    ALORS , une idé ??
    PS: grosso modo t1.cl1(+)=t2.cl1(+) t1.cl2(+)=t2.cl2(+) t1.col3(+)=t2.col3(+)
    ainssi de suite avec les autres>> mais si j f les + des deux coté j'aurais "ORA-01468 un prédicat ne peut référencer qu'une table en jointure externe".

  2. #2
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Si tu veux faire un FULL OUTER JOIN, il faut obligatoirement passer par l'écriture de ton ordre SQL en format ANSI, comme montrer dans l'exemple ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT d.department_id, e.employee_id
      FROM employees e
      FULL OUTER JOIN departments d
        ON e.department_id = d.department_id
     ORDER BY d.department_id;
    Plus de précision ici

  3. #3
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut nonon
    ça ne marche pas j'ai tte essayé avec le full j'ai 5000 enregistrement avec
    plein de doublons .je crois que c'est a cause du nombre de clés étrangères en
    tout cas je suis plus que désespéré (anémique) .

    A L'AIIIIIIIIIIIIIIIIIIDE
    J'Ai PLUS QU'UNE SEMAINE ,SINON JE DEVRAI REDOUBLER POUR SOUTENIRE .

    VOICI UN SHEMA pour mieux comprendre + les tables jointes


    PS:
    ce qui est bizarre et que le modérateur doit savoir c'est que j'ai posté une réponse le jour
    même ou le 2eme message a été écrit .
    et le serveur de dev.com la littéralement aspiré, c'est navrant.
    Fichiers attachés Fichiers attachés

  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
    Elle doit faire quoi ta requete ?

    Car la redondance ça n'a jamais été bon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    AND s.n_chass 		= v.n_chass
    AND s.num_compm 	= v.num_compm
    AND s.num_prest 	= v.num_prest
     
    AND hp.n_chass 		= v.n_chass
    AND hp.num_compm 	= v.num_compm
    AND hp.num_prest 	= v.num_prest
     
    AND hp.n_chass(+) 	= s.n_chass
    AND hp.num_compm(+) 	= s.num_compm
    AND hp.num_prest(+) 	= s.num_prest
    La seconde partie t'oblige à avoir des données dans hp=v.
    Faire un lien entre hp et s (Huile_Prest et Piece_Prest) n'a pas lieu d'être dans ton cas :
    HUILE_PREST (hp) est une sous table de PREST_VEH (v)
    PIECE_PREST (s) est une sous table de PREST_VEH (v)

    Ensuite dans tes selections, Dans le cas de jointures externes, il ne faut pas utiliser des colonnes des sous tables (sauf si c'est ce que tu veux) si tu veux les données de la table principale.

    Je vais modifier ta requete. Mais dis ce que ça doit faire quand même.
    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
    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
    Solution 1:
    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
    SELECT v.num_compm, v.n_chass, v.num_prest, t.des_prest prestation, 
    	h.des_huil huile, hp.qt_hp, 
    	p.des_piec piece, pp.qt_pm
     
    FROM 	PREST_VEH v, COMD_PM c, PRESTATION t,
    	HUILE_PREST hp,	HUILE h,
    	PIECE_PREST pp, PIECE p
     
    WHERE c.num_compm 		= v.num_compm
    AND   v.num_prest 		= t.num_prest
     
    AND   pp.n_chass 	(+)	= v.n_chass
    AND   pp.num_compm 	(+)	= v.num_compm
    AND   pp.num_prest 	(+)	= v.num_prest
     
    AND   p.ref_piec	(+)	= pp.num_piece
     
    AND   hp.n_chass 	(+)	= v.n_chass
    AND   hp.num_compm 	(+)	= v.num_compm
    AND   hp.num_prest 	(+)	= v.num_prest
     
    AND   h.code_huil	(+)	= hp.num_hl
    Solution 2 (Moins jolie dans ce cas) :
    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
    SELECT v.num_compm, v.n_chass, v.num_prest, t.des_prest prestation, 
    	(SELECT h.des_huil FROM HUILE h WHERE h.code_huil = hp.num_hl) AS huile, hp.qt_hp, 
    	(SELECT p.des_piec FROM PIECE p WHERE p.ref_piec = pp.num_piece) AS piece, pp.qt_pm
     
    FROM 	PREST_VEH v, COMD_PM c, PRESTATION t,
    	HUILE_PREST hp,	PIECE_PREST pp
     
    WHERE c.num_compm 		= v.num_compm
    AND   v.num_prest 		= t.num_prest
     
    AND   pp.n_chass 	(+)	= v.n_chass
    AND   pp.num_compm 	(+)	= v.num_compm
    AND   pp.num_prest 	(+)	= v.num_prest
     
    AND   hp.n_chass 	(+)	= v.n_chass
    AND   hp.num_compm 	(+)	= v.num_compm
    AND   hp.num_prest 	(+)	= v.num_prest
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  6. #6
    Membre habitué Avatar de scofield
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2006
    Messages
    179
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2006
    Messages : 179
    Points : 181
    Points
    181
    Par défaut
    ma requete doi recuperé toute les huiles et les piece utilisés dans une prestation par vehicule (les + c'est pour les prestation san piece ou sans huile *les vides) la table prest_veh est la pour representer la cardinalité 1..n (une demande de prest peut avoir un ou plusieur vehicule a maintenire).
    je teste ca et je reviens .
    le delai c'est pour le 8 (depot) .j'avait carément laissé tombé : j croise les doit

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

Discussions similaires

  1. Réponses: 24
    Dernier message: 24/07/2007, 17h48
  2. [MySQL] avis sur des clés secondaires croisées
    Par Giantrick dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 17/05/2007, 09h15
  3. faire une jointure sur des clés différentes
    Par phpaide dans le forum Requêtes
    Réponses: 3
    Dernier message: 13/09/2006, 10h16
  4. [Oracle 9.2.0.7] Comment updater sur des clés de partition ?
    Par le_nullos_des_nullos dans le forum Oracle
    Réponses: 3
    Dernier message: 05/02/2006, 00h26
  5. Réponses: 2
    Dernier message: 22/04/2005, 16h44

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