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 :

Jointures externe multiples sur une table


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Par défaut Jointures externe multiples sur une table
    Bonjour,

    je cherche à écrire une requête SQL Oracle (version 7) et je dois faire plusieurs jointures externes sur une même table
    j'ai 4 tables principales (en bleu) et des tables 'thesaurus' (en orange)
    c'est ce que je fais généralement sur Access sans problème mais la requête ci-dessous est tellement lente à s'exécuter que je souhaite l'exécuter sous oracle pour gagner en performance
    mais j'ai une erreur
    ORA-01417: une table peut être de jointure externe pour une autre table au moins
    comment puis-écrire cette requête ?
    d'avance merci

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    SELECT A.ND_N_IDPATIENT,A.IE_N_INDICATIONS,B.PE_M_HIST_MALADIE,B.PE_M_TRAITEMENT_JOUR,B.PE_M_COMMENT_REPOS FROM (
    SELECT UNIQUE
    concatenat(EFFORT.TABEFFORT_VENUE.EFFORT_ID) AS IE_N_INDICATIONS,
    EFFORT.TABNUMERO_DOSSIER.ND_N_IDPATIENT,
    EFFORT.TABNUMERO_DOSSIER.ND_T_NUM_DOSSIER,
    EFFORT.TABNUMERO_DOSSIER.ND_T_NOM,
    EFFORT.TABNUMERO_DOSSIER.ND_T_PRENOM,
    EFFORT.TABNUMERO_DOSSIER.ND_N_SEXE, 
    EFFORT.TABNUMERO_DOSSIER.ND_D_DATE_NAISS,
    EFFORT.TABNUMERO_DOSSIER.ND_T_IPUM,
    EFFORT.TABEFFORT_VENUE.EFFORT_ID,
    EFFORT.TABEFFORT_VENUE.E_N_IDVENUE,
    EFFORT.TABEFFORT_VENUE.E_D_DATE_EPREUVE,
    EFFORT.TABEFFORT_VENUE.E_N_NUM_EPREUVE,
    EFFORT.TABPREALABLE_EFFORT.PE_N_HEURE,
    EFFORT.TABPREALABLE_EFFORT.PE_N_DEMANDEUR,
    EFFORT.TABPREALABLE_EFFORT.PE_N_HOSPI,
    EFFORT.TABPREALABLE_EFFORT.PE_N_PRAT_HOSPITALIER,
    EFFORT.TABPREALABLE_EFFORT.PE_N_PRAT_ATTACHE,
    EFFORT.TABINDICATION_EFFORT.IE_T_AUTRES_INDICATIONS,
    EFFORT.TABPREALABLE_EFFORT.PE_N_AGE,
    EFFORT.TABPREALABLE_EFFORT.PE_N_POIDS,
    EFFORT.TABPREALABLE_EFFORT.PE_N_TAILLE,
    EFFORT.TABPREALABLE_EFFORT.PE_N_INFIRMIERE,
    EFFORT.TABPREALABLE_EFFORT.PE_N_PROTOCOLE,
    EFFORT.TABPREALABLE_EFFORT.PE_N_SALLE,
    EFFORT.TABPREALABLE_EFFORT.PE_B_TNT,
    EFFORT.TABPREALABLE_EFFORT.PE_B_THALLIUM,
    EFFORT.TABPREALABLE_EFFORT.PE_B_VO2,
    EFFORT.TABPREALABLE_EFFORT.PE_N_FREQ_REPOS,
    EFFORT.TABPREALABLE_EFFORT.PE_N_TAS_REPOS,
    EFFORT.TABPREALABLE_EFFORT.PE_N_TAD_REPOS,
    EFFORT.TABPREALABLE_EFFORT.PE_N_EPREUVES_ABRUTE,
    EFFORT.TABPREALABLE_EFFORT.PE_N_PALIER_DEBUT
    FROM 
    EFFORT.TABNUMERO_DOSSIER,
    EFFORT.TABEFFORT_VENUE,
    EFFORT.TABPREALABLE_EFFORT,
    EFFORT.TABINDICATION_EFFORT,
    EFFORT.TABINDICATIONS_LIBELLE,
    EFFORT.TABMEDECINS,
    EFFORT.TABHOSPITALISATION,
    EFFORT.TABPRATICIENS_HOSPI,
    EFFORT.TABPRATICIENS_ATTAC,
    EFFORT.TABINFIRMIERES,
    EFFORT.TABTYPE_PROTOC,
    EFFORT.TABEFFORT_SALLES,
    EFFORT.TABEPREUVES_ABRUP 
    WHERE 
    EFFORT.TABNUMERO_DOSSIER.ND_N_IDPATIENT(+)=EFFORT.TABEFFORT_VENUE.E_N_IDPATIENT AND
    EFFORT.TABEFFORT_VENUE.EFFORT_ID(+)=EFFORT.TABPREALABLE_EFFORT.EFFORT_ID AND 
    EFFORT.TABPREALABLE_EFFORT.EFFORT_ID(+)=EFFORT.TABINDICATION_EFFORT.EFFORT_ID AND 
    EFFORT.TABINDICATION_EFFORT.IE_N_INDICATIONS(+)=EFFORT.TABINDICATIONS_LIBELLE.N_CODE AND 
    EFFORT.TABPREALABLE_EFFORT.PE_N_DEMANDEUR(+)=EFFORT.TABMEDECINS.N_CODE AND 
    EFFORT.TABPREALABLE_EFFORT.PE_N_HOSPI(+)=EFFORT.TABHOSPITALISATION.N_CODE AND 
    EFFORT.TABPREALABLE_EFFORT.PE_N_PRAT_HOSPITALIER(+)=EFFORT.TABPRATICIENS_HOSPI.N_CODE AND 
    EFFORT.TABPREALABLE_EFFORT.PE_N_PRAT_ATTACHE(+)=EFFORT.TABPRATICIENS_ATTAC.N_CODE AND 
    EFFORT.TABPREALABLE_EFFORT.PE_N_INFIRMIERE(+)=EFFORT.TABINFIRMIERES.N_CODE AND 
    EFFORT.TABPREALABLE_EFFORT.PE_N_PROTOCOLE(+)=EFFORT.TABTYPE_PROTOC.N_CODE AND 
    EFFORT.TABPREALABLE_EFFORT.PE_N_SALLE(+)=EFFORT.TABEFFORT_SALLES.N_CODE AND 
    EFFORT.TABPREALABLE_EFFORT.PE_N_EPREUVES_ABRUTE(+)=EFFORT.TABEPREUVES_ABRUP.N_CODE) A,EFFORT.TABPREALABLE_EFFORT B 
    WHERE A.EFFORT_ID(+)=B.EFFORT_ID AND A.ND_N_IDPATIENT=3290263;

  2. #2
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Le problème vient des jointures qui ne respectent pas la norme SQL92 et le fait qu'on ne peut faire une autre jointure externe sur une table déjà jointe extérieurement .
    L'idéal serait de passer par des OUTER JOIN mais en Oracle 7, ça n'existe pas je pense.

    Reste à explorer la piste des sous-requêtes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT ..
    FROM MaTable,
      (SELECT ..
      FROM  Table_Facultative1,
        (SELECT ..
        FROM Tabl_Fac2
        )
      WHERE Tab1 = Tab2(+)
      )
    WHERE Tab = Tab1(+)
    Pas très propre et peu efficace je pense..

  3. #3
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Par défaut
    merci pour ta réponse,
    c'est ce que j'ai fait en utilisant des alias pour les tables et çà semble fonctionner mais c'est vraiment galère pour récupérer les champs dont on a besoin...

  4. #4
    Membre éclairé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2011
    Messages : 257
    Par défaut
    j'ai le code suivant fonctionne mais je ne m'y retrouve pas pour afficher seulement les champs dont j'ai besoin en remplaçant notamment les code thesaurus par le libellé correspondant

    la 'difficulté' est que le nom de T_LIBELLE apparait dans toutes les tables thésaurus
    il faut donc que je les renomme à l'aide d'ALIAS mais encore faut-il que je m'y retrouve dans mes select...

    EFFORT.TABPREALABLE_EFFORT.PE_N_DEMANDEUR à remplacer par EFFORT.TABMEDECINS.T_LIBELLE à renommer en PE_N_DEMANDEUR
    EFFORT.TABPREALABLE_EFFORT.PE_N_HOSPI à remplacer par EFFORT.TABHOSPITAMISAT.T_LIBELLE à renommer en PE_N_HOSPI
    EFFORT.TABPREALABLE_EFFORT.PE_N_PRAT_HOPSITALIER à remplacer par EFFORT.TABPRATICIENS_HOSPI.T_LIBELLE à renommer en PE_N_PRAT_HOPSITALIER
    EFFORT.TABPREALABLE_EFFORT.PE_N_PRAT_ATTACHE à remplacer par EFFORT.TABPRATICIEN_ATTAC.T_LIBELLE à renommer en PE_N_PRAT_ATTACHE
    EFFORT.TABPREALABLE_EFFORT.PE_N_INFIRMIERE à remplacer par EFFORT.TABINFIRMIERES.T_LIBELLE à renommer en PE_N_INFIRMIERE
    EFFORT.TABPREALABLE_EFFORT.PE_N_PROTOCOLE à remplacer par EFFORT.TABTYPE_PROTOC.T_LIBELLE à renommer en PE_N_PROTOCOLE
    EFFORT.TABPREALABLE_EFFORT.PE_N_SALLE à remplacer par EFFORT.TABEFFORT_SALLES.T_LIBELLE à renommer en PE_N_SALLE
    EFFORT.TABPREALABLE_EFFORT.PE_N_EPREUVES_ABRUTE à remplacer par EFFORT.TABEPREUVES_ABRUP.T_LIBELLE à renommer en PE_N_EPREUVES_ABRUTE


    d'avance merci pour votre aide


    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
    38
    39
    40
    41
    42
    43
    44
     
    Select * from (
    select 
    V.ND_N_IDPATIENT,
    V.ND_T_NUM_DOSSIER,
    V.ND_T_NOM,
    V.ND_T_PRENOM,
    V.ND_N_SEXE,
    V.ND_D_DATE_NAISS,
    V.ND_T_IPUM,
    U.EFFORT_ID,
    U.E_N_IDVENUE,
    U.E_D_DATE_EPREUVE,
    U.E_N_NUM_EPREUVE,
    U.PE_N_HEURE,
    U.IE_N_INDICATIONS
    from 
    (select * from 
    (select * from 
    (select * from 
    (select * from 
    (select * from 
    (select * from 
    (select * from 
    (select * from 
    (Select * from 
    (Select * from 
    (Select * from EFFORT.TABPREALABLE_EFFORT) A, 
    (select EFFORT.TABINDICATION_EFFORT.EFFORT_ID,EFFORT.TABINDICATIONS_LIBELLE.T_LIBELLE AS IE_N_INDICATIONS,EFFORT.TABINDICATION_EFFORT.IE_T_AUTRES_INDICATIONS
    from EFFORT.TABINDICATION_EFFORT, EFFORT.TABINDICATIONS_LIBELLE
    where EFFORT.TABINDICATION_EFFORT.IE_N_INDICATIONS(+)=EFFORT.TABINDICATIONS_LIBELLE.N_CODE) B
    Where A.EFFORT_ID(+)=B.EFFORT_ID) C, EFFORT.TABMEDECINS D
    where C.PE_N_DEMANDEUR(+)=D.N_CODE) E, EFFORT.TABHOSPITALISATION F
    where E.PE_N_HOSPI(+)=F.N_CODE) G, EFFORT.TABPRATICIENS_HOSPI H
    where G.PE_N_PRAT_HOSPITALIER(+)=H.N_CODE) I, EFFORT.TABPRATICIENS_ATTAC J
    where I.PE_N_PRAT_ATTACHE(+)=J.N_CODE) K, EFFORT.TABINFIRMIERES L
    where K.PE_N_INFIRMIERE(+)=L.N_CODE) M, EFFORT.TABTYPE_PROTOC N
    where M.PE_N_PROTOCOLE(+)=N.N_CODE) O, EFFORT.TABEFFORT_SALLES P
    where O.PE_N_SALLE(+)=P.N_CODE) Q, EFFORT.TABEPREUVES_ABRUP R
    where Q.PE_N_EPREUVES_ABRUTE(+)=R.N_CODE) S, EFFORT.TABEFFORT_VENUE T
    where T.EFFORT_ID(+)=S.EFFORT_ID) U, EFFORT.TABNUMERO_DOSSIER V
    where V.ND_N_IDPATIENT(+)=U.E_N_IDPATIENT
    )
    WHERE ROWNUM<10;
    schéma relationnel sous access
    Nom : schema_relationnel.png
Affichages : 877
Taille : 91,9 Ko

Discussions similaires

  1. Jointures multiples sur une table
    Par allstar dans le forum Langage SQL
    Réponses: 7
    Dernier message: 06/11/2012, 11h48
  2. jointure externe FULL sur une même table [SQLServer 2005]
    Par belrifou dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/03/2010, 15h14
  3. Projection multiple sur une table
    Par Mister Nono dans le forum Hibernate
    Réponses: 2
    Dernier message: 20/09/2007, 13h21
  4. relations multiples sur une table
    Par lapuce dans le forum Modélisation
    Réponses: 2
    Dernier message: 18/07/2007, 17h58
  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