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 conditions supplémentaires


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Par défaut Jointure externe avec conditions supplémentaires
    Bonjour,

    J'ai tenté de chercher sur le forum mais pas évident quand on ne sait pas soit même comment définir le problème :s

    Je souhaiterais faire une jointure externe entre deux tables dont voici les structures imposées :

    - individu (no_individu)
    - telephone (id,no_individu,no_telephone,type,statut)

    Dans la table téléphone il n'y a d'enregistrements que si l'individu n'a effectivement un téléphone. D'où mon commencement de piste vers une jointure externe.

    De plus un même individu peut avoir plusieurs téléphones de type différent.
    Par exemple, on aura :
    individu n°4 avec un téléphone fixe 02xxxxxxxx.
    individu n°4 avec un téléphone mobile 02xxxxxxxx
    individu n°5 aucune téléphone

    Du coup dans ma requête ressemble à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select *
    from individu,telephone
    where individu.no_individu=telephone.no_individu(+)
    Jusque là ca marche, j'ai bien tout le monde avec ou sans numéro de téléphone
    Mais quand je rajoute une condition supplémentaire, par exemple je ne veux que les téléphone fixes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select *
    from individu,telephone
    where individu.no_individu=telephone.no_individu(+)
    and type='fixe'
    Ca m'exclut tout ceux qui n'ont pas de téléphone.
    J'ai essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    and (type='fixe' or type is null)
    Mais que nenni !

    Pour info, je travaille sur Oracle 10g R2.

    Merci d'avance si vous avez des pistes d'investigation.

    Frédéric.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 462
    Par défaut
    En bref, dans les jointures externes à la mode Oracle, il faut, dans le WHERE, rajouter le (+) sur chaque colonne appartenant à la table externe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select *
    from individu,telephone
    where individu.no_individu=telephone.no_individu(+)
    and type(+)='fixe'
    Le mieux serait quand même d'adopter la syntaxe normalisée à base de LEFT OUTER JOIN, qui est disponible depuis Oracle 9i.

  3. #3
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Par défaut
    Quelle patate ! Je mettais le (+) au mauvais endroit

    Merci beaucoup pour la réponse.
    Ca ressemble donc à ça si jamais il y a une autre personne qui passe par là pour la même question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM individu,telephone 
    LEFT OUTER JOIN on (individu.no_individu=telephone.no_individu 
    AND type='fixe')
    Bonne journée et encore merci.

    Frédéric.

  4. #4
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Bonjour,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT *
    FROM individu,telephone
    WHERE individu.no_individu=telephone.no_individu(+)
    AND type='fixe'
    C'est tout à fait logique que la requête ci-dessus ne fonctionne pas correctement. En effet, par la clause suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE individu.no_individu=telephone.no_individu(+)
    nous voulons qu'Oracle nous renvoi tous les enregistrements de la table individu qui possèdent un correspondant dans la table telephone. De plus,
    nous demandons à Oracle que, lorsque cette correspondance n'existe pas à cause de la table telephone, d’être gentil quand même en nous affichant les enregistrements de la table individu et en remplaçant les enregistrements manquants de la table telephone par des NULLs.

    Donc, suivez bien, que dans le cas d'absence de correspondance entre les deux tables, les informations provenant de la table téléphone sont NULLs

    Alors comment voudriez-vous dans ce cas que la clause suivante fonctionne correctement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND telephone.type ='fixe'
    NULL ne peut pas être égale à fixe.

    D'où la proposition de pomalaix

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND type(+)='fixe'

    Conclusion
    A chaque fois que vous avez une jointure entre deux tables qui ressemble à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    where t1.id = t2.id(+)
    and   t2.colx = valx
    alors le (+) est inutile et peut être supprimé.

  5. #5
    Membre averti
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2011
    Messages : 16
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Bonjour,
    Alors comment voudriez-vous dans ce cas que la clause suivante fonctionne correctement
    C'est bien la raison pour laquelle je suis venu poser la question ici, je savais bien que ca ne fonctionnait pas

    Citation Envoyé par Mohamed.Houri Voir le message
    Conclusion
    A chaque fois que vous avez une jointure entre deux tables qui ressemble à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    where t1.id = t2.id(+)
    and   t2.colx = valx
    alors le (+) est inutile et peut être supprimé.
    Je ne suis pas d'accord. Le but est pour moi de récupérer les enregistrements des deux tables même s'il n'y a de correspondance. Si je supprime les (+) je perds ces enregistrements qui me sont précieux. Pour exemple, ce n'est pas parce qu'un individu n'a pas téléphone dans mon exemple qu'il doit être exclu des listings de paye ^^ Je vous laisse transmettre cette info à mes collègues qui se feront une joie de vous accueillir ^^

    En tout cas, j'ai bien réussi à faire ce que je voulais, merci Pomalaix.

  6. #6
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    La conclusion ne concernait pas votre cas bien précis. Elle s'adresse en général à ceux qui veulent comprendre pourquoi à l'origine vous n'aviez pas le résultat adéquat.

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

Discussions similaires

  1. Jointure externe avec condition
    Par laymo dans le forum SQL
    Réponses: 2
    Dernier message: 21/08/2012, 14h00
  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