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 :

[SQL] L'opérateur (+) dans un Where


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Points : 76
    Points
    76
    Par défaut [SQL] L'opérateur (+) dans un Where
    Bonjour à tous,
    Je vous écris parce que j'ai beaucoup de mal à écrire une requête sql. Le but est d'afficher toutes les lignes d'une table. Cependant cette table est liée à d'autres tables. Ce qui fait qu'en faisant une jointure normale je n'ai pas toutes les lignes!

    J'explique: je veux afficher toutes les lignes d'une table A avec certains éléments d'une table B.
    La table A a comme clef primaire (CL1, CL2, CL3, CL4). Et les champs: CH-A1, CH-A2
    La table B a comme clef primaire (CL1, CL2, CL5). Elle a des champs: CH-B1, CH-B2
    Une table C a comme clef primaire (CL3, CL4). et un champ CH-C5

    Je veux afficher toutes les lignes de A. Même celles qui n'existent pas dans B (avec NULL comme valeur dans les champs de cette table).

    Mon select est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.CL1, A.CL2, A.CL3, A.CL4, CH-A1, CH-A2, CH-B1, CH-B2
      FROM TABLEA A, TABLEB B
    WHERE A.CL1 = B.CL1
      AND A.CL2 = B.CL2
      AND B.CL5 IN (SELECT CH-C5 FROM TABLEC C WHERE A.CL3 = C.CL3 AND A.CL4 = C.CL4)
    Mais cette requête me donne pas les lignes qui n'existent pas dans table B!

    On m'a parlé de l'opérateur (+), j'ai donc modifié ma requête comme ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.CL1, A.CL2, A.CL3, A.CL4, CH-A1, CH-A2, CH-B1, CH-B2
      FROM TABLEA A, TABLEB B
    WHERE A.CL1 = B.CL1 (+)
      AND A.CL2 = B.CL2 (+)
      AND B.CL5 IN (SELECT CH-C5 FROM TABLEC C WHERE A.CL3 = C.CL3 AND A.CL4 = C.CL4)
    Mais c'est sans succès!

    Pouvez-vous m'aider? Je vous remercie d'avance.
    mamid

  2. #2
    Membre confirmé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Points : 502
    Points
    502
    Par défaut
    il vaut mieux utiliser les jointures normalisée pour faire ta requete:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.CL1, A.CL2, A.CL3, A.CL4, CH-A1, CH-A2, CH-B1, CH-B2
    FROM TABLEA A
    LEFT JOIN TABLEB B ON A.CL1 = B.CL1
      AND A.CL2 = B.CL2 
    LEFT JOIN TABLEC C ON
      AND A.CL3 = C.CL3 
      AND A.CL4 = C.CL4
      AND B.CL5 = C.CH-C5

    Le LEFT JOIN prend toutes les lignes de la partie gauche, et seulement celle de droite si elle correspondent à la condition (ON)

    tu devrais trouver des tutos sur les jointures sur le site de sqlpro http://sqlpro.developpez.com/
    Juvamine

  3. #3
    Membre régulier
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Points : 76
    Points
    76
    Par défaut
    Merci javamin pour ta réponse. J'ai pu la faire marcher en la modifiant un peu.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT A.CL1, A.CL2, A.CL3, A.CL4, CH-A1, CH-A2, CH-B1, CH-B2
    FROM TABLEA A
    LEFT JOIN TABLEC C ON
      AND A.CL3 = C.CL3 
      AND A.CL4 = C.CL4
    LEFT JOIN TABLEB B ON A.CL1 = B.CL1
      AND A.CL2 = B.CL2 
      AND B.CL5 = C.CH-C5
    Puisque c'est dans la table B qu'il y a des lignes manquantes, j'ai compris, qu'il faut mettre la condition (AND B.CL5 = C.CH-C5) dans la jointure de la table B.

    Merci encore.
    mamid

  4. #4
    Membre confirmé Avatar de juvamine
    Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2004
    Messages
    414
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Mai 2004
    Messages : 414
    Points : 502
    Points
    502
    Par défaut
    s'il ne manque des données dans la table B, le LEFT JOIN sur la table C est inutile, il vaut mieux faire un INNER JOIN

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT A.CL1, A.CL2, A.CL3, A.CL4, CH-A1, CH-A2, CH-B1, CH-B2
    FROM TABLEA A
    INNER JOIN TABLEC C ON
      AND A.CL3 = C.CL3 
      AND A.CL4 = C.CL4
    LEFT JOIN TABLEB B ON A.CL1 = B.CL1
      AND A.CL2 = B.CL2 
      AND B.CL5 = C.CH-C5
    Le inner join sélectionne toutes les lignes qui correspondent à la condition ON (équivalent d'un select * from a,b where a.id = b.id)

    Documente toi sur les jointures, c'est une notion essentielle, qui te permettra de résoudre bien des problèmes.

    A+
    juva
    Juvamine

  5. #5
    Membre régulier
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    163
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 163
    Points : 76
    Points
    76
    Par défaut
    Merci.
    mamid

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 27/07/2009, 15h02
  2. [t-sql] instruction CASE dans clause WHERE
    Par ignitionflip dans le forum Langage SQL
    Réponses: 4
    Dernier message: 22/01/2007, 18h07
  3. [PL/SQL Oracle] Syntaxe dans clause where
    Par Misdrhaal dans le forum Oracle
    Réponses: 2
    Dernier message: 01/03/2006, 13h33
  4. [SQL 9i ] format de date dans un where
    Par booth dans le forum Oracle
    Réponses: 5
    Dernier message: 14/10/2005, 10h23
  5. 2 champs dans un where , possible en sql server ?
    Par voyageur dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 19/10/2004, 05h01

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