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 avec constante


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de magic charly
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut Jointure externe avec constante
    Bonjour à tous,

    Je rencontre actuellement quelques soucis avec une requête et je sollicite vos lumières. Cela concerne l'utilisation de jointures externes. La table TO contient des valeurs de champ0 qui n'existent pas forcément dans T1. La table T1 contient des valeurs de champ1 qui n'existent pas forcément dans T2. La table T2 ne contient pas forcément un enregistrement qui respecte la condition (4) . Je souhaiterais que le nombre de records remonté par cette requête soit toujours identique même si la correspondance entre TO.champ0 et T2.champ3 n'a pu être réalisée. Actuellement ce n'est pas le cas le nb de records retourné varie suivant la valeur fixe donnée à la COND 4.

    Quelle est mon erreur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT T0.champ0, T2.champ3
    FROM T0, T1, T2
    WHERE
    TO.champ0=T1.champ0(+)
    AND
    T1.Champ1=T2.champ1(+)
    AND
    T2.champ2(+)='A';    (COND 4)
    Merci d'avance.

    M_C

    PS: je suis en Oracle 10i

  2. #2
    Expert confirmé
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Par défaut
    Je suis dubitatif quand je vois cette syntaxe générée par certains ETL: T2.champ2(+)='A'.

    La bonne syntaxe serait, en SQL92 si ton programme appelant l'accepte (ou que les administrateurs le veuillent bien), la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT T0.champ0, T2.champ3
    FROM T0
    LEFT JOIN  T1 
    ON T0.champ0=T1.champ0 
    LEFT JOIN T2 
    ON T1.Champ1=T2.champ1 AND T2.champ2='A';
    Si la syntaxe n'est pas acceptée par l'administrateur, bien qu'elle le soit par la plupart des programmes appelant, il faut peut être essayer cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T0.champ0, T2.champ3
    FROM T0, T1, T2
    WHERE
    T0.champ0=T1.champ0(+)
    AND
    T1.Champ1=T2.champ1(+)
    AND
    (T2.champ2='A' or T2.champ2 is null);
    edit : une autre solution, mais la syntaxe sql 92 reste préférable (LEFT etc..), pourrait être la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT T0.champ0, T2.champ3
    FROM T0, T1,
    (select champ0, champ1 from T2 where T2.champ2='A')
    T2_bis
    WHERE
    T0.champ0=T1.champ0(+)
    AND
    T1.Champ1=T2_bis.champ1(+);

  3. #3
    Membre confirmé Avatar de magic charly
    Inscrit en
    Février 2006
    Messages
    167
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 167
    Par défaut
    Merci pour ton aide.

    Je travaille sur un générateur de SQL à partir de JAVA. J'essaye donc de construire un code SQL aussi générique que possible. De ce point de vue, les solutions 1 et 3 seraient à priori à bannir. La solution 2 semblait être la plus adaptée. J'ai donc testé la seconde solution et en fait elle ne permet pas de faire ce que je souhaite. Si jamais la condition n'est pas respectée le record n'est pas retourné.

    Aurais tu une explication à ce phénomène ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/10/2007, 13h04
  2. Jointure externe avec prédicat dans la clause de jointure
    Par aflp91 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 08/12/2006, 00h23
  3. Pb de jointure externe avec un number
    Par mch_27 dans le forum Oracle
    Réponses: 2
    Dernier message: 07/03/2006, 15h33
  4. [SQL] jointure externe avec 3 tables, comment faire ....
    Par grumbok dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/08/2005, 16h13
  5. jointure externe avec un where, me pose problème!
    Par Danae dans le forum Langage SQL
    Réponses: 3
    Dernier message: 18/07/2005, 17h37

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