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 :

Problèmes jointures externes


Sujet :

SQL Oracle

  1. #1
    B&B
    B&B est déconnecté
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 20
    Points : 14
    Points
    14
    Par défaut Problèmes jointures externes
    Salut,

    J'ai un souci au niveau d'une jointure que j'arrive pas à résoudre.
    J'ai 3 tables :

    TABLE codes (1000 lignes)
    code_uid
    nom

    TABLE groupes (60 lignes)
    group_uid
    nom_groupe
    type_groupe

    TABLE code_groupes (400 lignes)
    group_uid
    code_uid

    Le but de la requete est de recupérer pour une recherche par nom les codes groupes et non groupes.

    Par exemple je recherche 'TORR%', il va me sortir par exemple 15 codes groupes avec le nom du groupes et 210 codes non groupes.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.code_uid, c.nom, g.nom_groupe, g.group_type 
    FROM codes c, groupes g, code_groupes cg 
    WHERE cg.code_uid (+)= c.code_uid
    AND cg.group_uid = g.group_uid
    AND c.nom LIKE 'TORR%'
    AND g.group_type = 'GROUPE3'
    La requete ci-dessus me sort que les codes groupes. Lorsque je mets
    AND cg.group_uid (+)= g.group_uid, il me génére l'erreur :

    ORA-01417 : a table may be outer joined to at most one other table

    Je n'arrive pas à faire une jointure externe sur 2 champs d'une même table..

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    Je ne suis pas sûr d'avoir tout compris à ton code mais je pense que j'essayerais ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT c.code_uid, c.nom, cd.nom_groupe, cd.group_type 
    FROM codes c, 
         (select g.nom_groupe, g.group_type  
            from groupes g, code_groupes cg 
            where cg.group_uid = g.group_uid
                AND g.group_type = 'GROUPE3'
         ) cd
    WHERE cd.code_uid (+)= c.code_uid
        AND c.nom LIKE 'TORR%'

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Plus simplement, c'est une des lacune de la notation en (+) pour les jointures externes.

    Si vous voulez joindre trois tables : A - B - C, avec une jointure externe de A vers B, il faut aussi mettre un jointure externe de B vers C et aussi forcer les conditions sur C à être externes.

    Pour votre exemple, il aurait fallu rentrer le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        c.code_uid,
        c.nom,
        g.nom_groupe,
        g.group_type 
    FROM
        codes c,
        groupes g,
        code_groupes cg 
    WHERE
        c.code_uid = cg.code_uid(+)
    AND cg.group_uid = g.group_uid(+)
    AND c.nom LIKE 'TORR%'
    AND g.group_type(+) = 'GROUPE3'

    Mais, le SQL normalisé est plus joli, plus compréhensible et plus portable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SELECT
        c.code_uid,
        c.nom,
        g.nom_groupe,
        g.group_type 
    FROM
        codes c
        LEFT OUTER JOIN code_groupes cg 
          ON cg.code_uid = c.code_uid
        INNER JOIN groupes g
          ON g.group_uid = cg.group_uid
         AND g.group_type = 'GROUPE3' -- Essayez de mettre cette clause dans le where
    WHERE
        c.nom LIKE 'TORR%'

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Mais, le SQL normalisé est plus joli, plus compréhensible et plus portable
    Je ne lancerai pas un débat sur ce passionnnant sujet, mais le fait que ce soit plus joli et plus compréhensible, est tout à fait subjectif...
    Je pense que nombre d'habitués d'Oracle sont, comme moi, plus à l'aise sans les INNER JOIN et LEFT OUTER JOIN.
    Et pour la portabilité, un point pour toi !

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par Jerome_Mtl Voir le message
    Je ne lancerai pas un débat sur ce passionnnant sujet, mais le fait que ce soit plus joli et plus compréhensible, est tout à fait subjectif...
    Je pense que nombre d'habitués d'Oracle sont, comme moi, plus à l'aise sans les INNER JOIN et LEFT OUTER JOIN.
    Et pour la portabilité, un point pour toi !
    +1

    Sauf que la portabilité est une approche qui ne permet pas d'utiliser correctement les outils à disposition : Oracle sans PL ou SQLserver sans transac, tout de suite, on fait moins de choses.

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

Discussions similaires

  1. Problème jointure externe et restriction where
    Par Cyrus59 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 10/09/2012, 17h45
  2. Problème jointure externe (LEFT JOIN et pas (+))
    Par tatayoyo dans le forum ODI (ex-Sunopsis)
    Réponses: 1
    Dernier message: 12/05/2011, 13h15
  3. [VxiR2] Problème "jointure externe ambigüe"
    Par juju05 dans le forum Deski
    Réponses: 4
    Dernier message: 02/08/2010, 11h20
  4. Réponses: 3
    Dernier message: 29/10/2007, 13h04
  5. Problème jointures externes BO
    Par leelee dans le forum Designer
    Réponses: 1
    Dernier message: 17/03/2007, 09h29

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