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

PL/SQL Oracle Discussion :

Problème avec jointure externe


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Points : 66
    Points
    66
    Par défaut Problème avec jointure externe
    Je cherche à faire une jointure externe. Voici ma req.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select distinct tab2.chp1, tab1.chp2, tab2.chp3
        FROM table1 tab1, table2 tab2
        WHERE (select to_date(datetab,'dd/mm/rr') from table3 where cle='DATETAB') = tab2.datetab 
        AND tab1.datetab = (select max(i2.datetab) from table1 i2)
        and tab1.code = tab2.chp1   (+)
        AND 'Y' = tab2.chp2  (+)
        AND 'Y' = tab2.ch3  (+)
    Je voudrais récupérer toutes les lignes de la table tab1 même si elles ne sont pas présents dans la table tab2.

    mais ça marche pas. je récupère que les lignes en commun

    merci

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    En simplifiant ça donne quoi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT DISTINCT tab2.chp1, tab1.chp2, tab2.chp3, max(tab1.datetab) 
        FROM table1 tab1, table2 tab2, table3 tab3
        WHERE  NVL(tab2.datetab,to_date(tab3.datetab,'dd/mm/rr') ) = to_date(tab3.datetab,'dd/mm/rr') 
        AND tab3.cle='DATETAB'
        AND tab1.code = tab2.chp1   (+)
        AND 'Y' = tab2.chp2  (+)
        AND 'Y' = tab2.ch3  (+)
    GROUP BY tab2.chp1, tab1.chp2, tab2.chp3
    Le problème vient surement de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (select to_date(datetab,'dd/mm/rr') from table3 where cle='DATETAB') = tab2.datetab
    S'il n'y a pas de ligne dans tab2, cette condition est fausse

    c'est pourquoi j'ai ajouté le NVL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NVL(tab2.datetab,to_date(tab3.datetab,'dd/mm/rr') ) = to_date(tab3.datetab,'dd/mm/rr')
    Le to_date étant surement superflu ou alors il y a un souci dans le modéle de données.

  3. #3
    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
    remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT to_date(datetab,'dd/mm/rr') FROM table3 WHERE cle='DATETAB') = tab2.datetab
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ( tab2.datetab IS NULL OR tab2.datetab = (SELECT to_date(datetab,'dd/mm/rr') FROM table3 WHERE cle='DATETAB') )

  4. #4
    Membre du Club
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Points : 66
    Points
    66
    Par défaut
    Après le test.
    la solution de McM ne change rien au résultat de la requête.
    En revanche la solution de orafrance me donne plutôt toutes les lignes de la table table2 au lieu que ça soit de la table 1...??

  5. #5
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    le (+) ne doit pas être du bon coté alors.

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Le "alors" fait un peu "au pif"
    C'est quand même vachement plus clair avec un LEFT OUTER JOIN

  7. #7
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    Il faudrait fournir une adaptation correcte de la requête de base !
    Table3 n'est présent que dans une sous-requête dans la clause WHERE, donc ses colonnes sont innacessibles au niveau de la requête principale, donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    tab2.chp3
    ...
    AND 'Y' = tab2.ch3  (+)
    ne fonctionne pas
    Je voudrais récupérer toutes les lignes de la table tab1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND tab1.datetab = (SELECT max(i2.datetab) FROM table1 i2)
    Ca m'étonnerait que tu récupères toutes les lignes de table1...

Discussions similaires

  1. [SQL] Problème avec jointure externe
    Par critok dans le forum Langage SQL
    Réponses: 4
    Dernier message: 29/10/2009, 12h49
  2. Réponses: 5
    Dernier message: 30/03/2009, 10h04
  3. Problème avec jointure externe
    Par illight dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/04/2008, 12h23
  4. requête avec jointure externe
    Par GMI3 dans le forum Oracle
    Réponses: 8
    Dernier message: 12/04/2006, 10h29
  5. Requête avec jointure externe
    Par claralavraie dans le forum Langage SQL
    Réponses: 8
    Dernier message: 02/02/2006, 08h34

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