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

Oracle Discussion :

Oraclei : LEFT JOIN et conditions


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut Oraclei : LEFT JOIN et conditions
    Sous Oracle 8i, la syntaxe LEFT JOIN n'existe pas (dispo à partir de oracle 9), on doit utiliser la jointure de type (+)= .

    Cela fonctionne très bien dans le cas simple du style :

    SELECT A.FIELD1 FROM TABLE1 A LEFT JOIN TABLE2 B ON A.FIELD1=B.FIELD2 WHERE A.FIELD4 = 1;

    sera très bien traduit par :

    SELECT A.FIELD1 FROM TABLE1 A , TABLE2 B WHERE A.FIELD1(+)=B.FIELD2 AND A.FIELD4 = 1;

    mais dans le cas où j'ai besoin d'un critère de jointure, je ne sais pas comment faire :

    SELECT A.FIELD1 FROM TABLE1 A LEFT JOIN TABLE2 B ON A.FIELD1=B.FIELD2 AND B.FIELD3='TEST' WHERE A.FIELD4 = 1;

    parceque la syntaxe suivante :

    SELECT A.FIELD1 FROM TABLE1 A ,TABLE2 B WHERE A.FIELD1(+)=B.FIELD2 AND B.FIELD3='TEST' AND A.FIELD4 = 1;

    ne peut pas fonctionner correctement car le B.FIELD3='TEST' s'execute sur le résultat de la jointure et non sur la table jointe...

    Si quelqu'un connait la bonne syntaxe, il est le bienvenue ;-)

  2. #2
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Pour plus de lisibilté, merci d'utiliser les balises codes.

    Je pense que ta solution passe par quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.FIELD1 
    FROM TABLE1 A , (select * from table2 where field3 = 'TEST') B 
    WHERE A.FIELD1(+)=B.FIELD2 
       AND A.FIELD4 = 1;

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Citation Envoyé par plaineR
    Pour plus de lisibilté, merci d'utiliser les balises codes.

    Je pense que ta solution passe par quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.FIELD1 
    FROM TABLE1 A , (select * from table2 where field3 = 'TEST') B 
    WHERE A.FIELD1(+)=B.FIELD2 
       AND A.FIELD4 = 1;

    Je n'ai pas utilisé les balises codes pour pouvoirs mettre les champs importants en Gras..

    Donc, je suis apparement obligé d'imbriquer des requetes...bon, je vais voir... Merci

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    As-tu essayé tout simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.FIELD1 
    FROM TABLE1 A ,TABLE2 B 
    WHERE A.FIELD1(+)=B.FIELD2 
      AND B.FIELD3='TEST' 
      AND A.FIELD4(+) = 1;
    Es-tu sûr d'avoir mis le (+) du bon côté (beaucoup se trompent) ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    J'ai essayé, j'ai l'impression que ca ne marche pas...

  6. #6
    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 Re: Oraclei : LEFT JOIN et conditions
    Citation Envoyé par alexadvance
    Cela fonctionne très bien dans le cas simple du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.FIELD1 FROM TABLE1 A LEFT JOIN TABLE2 B ON A.FIELD1=B.FIELD2  WHERE A.FIELD4 = 1;
    sera très bien traduit par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT A.FIELD1 FROM TABLE1 A, TABLE2 B  WHERE A.FIELD1(+)=B.FIELD2  AND A.FIELD4 = 1
    Heu y'a pas une erreur sur la jointure ?
    Pour moi (du moins en mysql), le LEFT JOIN : C'est la table qui suit qui peut ne pas avoir de données (table2), c'est comme les (+)
    Dans ce cas c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.FIELD1 
    FROM TABLE1 A ,TABLE2 B 
    WHERE A.FIELD1 = B.FIELD2 (+)
      AND B.FIELD3 (+)='TEST' 
      AND A.FIELD4 = 1;

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    A vrai dire, je ne maitrise pas trop la syntaxe du (+) ..je n'ai jamais pensé à faire B.FIELD2 (+) , je croyais que le (+) était toujorus suivi du = ... Parceque là, en effet, çà à l'air de marcher...

    Test réels en cours ...

  8. #8
    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
    Bon, faudrait faire un cours sur les jointures externes (+) :
    2 TABLES T_NOM (idnom, nom) et T_TEL (idnom, tel)

    T_NOM :
    idnom, nom
    1, NOM1
    2, NOM2
    3, NOM3

    T_TEL
    idnom, tel
    1, 2107
    2, 2314
    2, 2315

    CREATE TABLE T_NOM(idnom NUMBER, nom VARCHAR2(5))

    CREATE TABLE T_TEL(idnom NUMBER, TEL NUMBER)

    Liste des noms avec leurs n° de tel (s'ils existent)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT n.idnom, n.nom, t.idnom, t.tel
    FROM T_NOM n, T_TEL t
    WHERE n.idnom = t.idnom (+)
    donnera

    1, NOM1, 1, 2107
    2, NOM2, 2, 2314
    2, NOM2, 2, 2315
    3, NOM3, NULL, NULL

    Les (+) sont à mettre après TOUTES les colonnes qui peuvent ne pas avoir de données

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT n.idnom, n.nom, t.idnom, t.tel
    FROM T_NOM n, T_TEL t
    WHERE n.idnom = t.idnom(+)
    AND t.tel (+) = 2107
    Donnera
    1, NOM1, 1, 2107
    2, NOM2, NULL, NULL
    3, NOM3, NULL, NULL

    Si on veut les noms ayant le tel 2107 ou n'ayant aucun n° de tel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT n.idnom, n.nom, t.idnom, t.tel
    FROM T_NOM n, T_TEL t
    WHERE n.idnom = t.idnom(+)
    AND (t.tel IS NULL OR t.tel = 2107)
    Donnera
    1, NOM1, 1, 2107
    3, NOM3, NULL, NULL

  9. #9
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par McM
    Bon, faudrait faire un cours sur les jointures externes (+) :
    Je crois aussi qu'un petit tuto (ou une rubrique dans la FAQ) sur les jointures externes (+) serait le bienvenu , ainsi que sur les jointures normalisées.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 222
    Points : 110
    Points
    110
    Par défaut
    Merci beaucoup les gars !

    Ca fait plaisir de voir des forums réactifs !

Discussions similaires

  1. LEFT JOIN ON plusieurs conditions
    Par comode dans le forum Langage SQL
    Réponses: 4
    Dernier message: 16/09/2011, 14h54
  2. Problème LEFT JOIN avec conditions ?
    Par Zane dans le forum Requêtes
    Réponses: 8
    Dernier message: 05/03/2010, 16h29
  3. LEFT JOIN et les places des tables dans la condition
    Par moukit233 dans le forum Requêtes
    Réponses: 2
    Dernier message: 04/01/2010, 09h08
  4. left outer join avec condition
    Par fisto dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 14/08/2007, 08h52
  5. [LEFT JOIN] Condition de jointure bizzare
    Par Celelibi dans le forum Requêtes
    Réponses: 7
    Dernier message: 17/05/2005, 18h38

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