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 :

jointure externe avec champ nul


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 86
    Par défaut jointure externe avec champ nul
    Bonjour,

    Je fais une jointure externe chp1(+) = chp2.
    mais lorsque les 2 champs sont nuls, la jointure ne fonctionne pas. en faisant
    ((chp1(+) = chp2) or (chp1 is null and chp2 is null)) ça ne marche j'ai le msg d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    outer join operator (+) not allowed in operand of OR or IN

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par radahm Voir le message
    Bonjour,

    Je fais une jointure externe chp1(+) = chp2.
    mais lorsque les 2 champs sont nuls, la jointure ne fonctionne pas. en faisant
    ((chp1(+) = chp2) or (chp1 is null and chp2 is null)) ça ne marche j'ai le msg d'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    outer join operator (+) not allowed in operand of OR or IN
    Bien entendu. (+) est déjà un OR.
    Essayez ((chp1 = chp2) or (chp1 is null)).

  3. #3
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 86
    Par défaut
    En faisant cela, je perds des enregistrement!!!

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par radahm Voir le message
    En faisant cela, je perds des enregistrement!!!
    Selon moi, vous devriez en avoir plus...

    En effet, "chp1(+) = chp2" équivaut à "t1.col2 = t2.col2 OR (t1.col2 IS NULL AND t2.col2 IS NULL)". Vu que j'ai oublié une restriction, vous devriez avoir plus de lignes, pas moins...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    WITH t1 AS
         (SELECT 1 AS col1, 2 AS col2 FROM DUAL UNION ALL
          SELECT 3        , 4         FROM DUAL UNION ALL
          SELECT 5        , NULL      FROM DUAL),
         t2 AS
         (SELECT 11 AS col1, 2    AS col2 FROM DUAL UNION ALL
          SELECT 13        , NULL         FROM DUAL UNION ALL
          SELECT 17        , 8            FROM DUAL)
    SELECT DISTINCT t1.col1
      FROM t1, t2
     WHERE t1.col2 = t2.col2 OR (t1.col2 IS NULL AND t2.col2 IS NULL);
     
     COL1
    -----
        1
        5

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Pourquoi ne pas utiliser les jointures ansi, c'est plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    WITH t1 AS
         (SELECT  1 AS col1, 2 AS col2 FROM DUAL UNION ALL
          SELECT  3        , 4         FROM DUAL UNION ALL
          SELECT  5        , NULL      FROM DUAL),
         t2 AS
         (SELECT 11 AS col1, 2 AS col2 FROM DUAL UNION ALL
          SELECT 13        , NULL      FROM DUAL UNION ALL
          SELECT 17        , 8         FROM DUAL)
    SELECT t2.col1 as col1_t2, t2.col2 as col2_t2,
           t1.col1 as col1_t1, t1.col2 as col2_t1
      FROM t2 LEFT OUTER JOIN t1
                ON t1.col2 = t2.col2
                OR (t1.col2 is null and t2.col2 is null);
     
    COL1_T2	COL2_T2	COL1_T1	COL2_T1
    11	2	1	2
    13		5	
    17	8

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Pourquoi ne pas utiliser les jointures ansi, c'est plus simple
    Parce que je l'avais gardé pour plus tard.
    Mais je préfère aussi.

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Désolé alors

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Désolé alors
    Euh... non, y a pas de quoi.

  9. #9
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Faire une jointure (externe, interne) sur champs nuls reste une idée bizarre.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    Connected to Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 
    Connected as impdata
     
    SQL> 
    SQL> WITH t1 AS
      2       (SELECT  1 AS col1, 2 AS col2 FROM DUAL UNION ALL
      3        SELECT  2        , NULL         FROM DUAL UNION ALL
      4        SELECT  3        , 4         FROM DUAL UNION ALL
      5        SELECT  5        , NULL      FROM DUAL),
      6       t2 AS
      7       (SELECT 11 AS col1, 2 AS col2 FROM DUAL UNION ALL
      8        SELECT 12        , NULL      FROM DUAL UNION ALL
      9        SELECT 13        , NULL      FROM DUAL UNION ALL
     10        SELECT 17        , 8         FROM DUAL)
     11  SELECT t2.col1 AS col1_t2, t2.col2 AS col2_t2,
     12         t1.col1 AS col1_t1, t1.col2 AS col2_t1
     13    FROM t2 LEFT OUTER JOIN t1
     14              ON t1.col2 = t2.col2
     15              OR (t1.col2 IS NULL AND t2.col2 IS NULL)
     16  ;
     
       COL1_T2    COL2_T2    COL1_T1    COL2_T1
    ---------- ---------- ---------- ----------
            11          2          1          2
            12                     2 
            12                     5 
            13                     2 
            13                     5 
            17          8            
     
    6 rows selected

  10. #10
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Faire une jointure (externe, interne) sur champs nuls reste une idée bizarre.
    En l'occurrence, on différencie bien le cas où les colonnes sont NULL de l'égalité de la jointure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ON t1.col2 = t2.col2
    OR (t1.col2 IS NULL AND t2.col2 IS NULL)
    Qu'est-ce qui vous gêne?

  11. #11
    Membre confirmé
    Inscrit en
    Mars 2009
    Messages
    86
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 86
    Par défaut
    En faisant cela, je ne récupères pas les lignes qui sont seulement dans la table 1.

  12. #12
    Membre chevronné

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Par défaut
    Citation Envoyé par radahm Voir le message
    En faisant cela, je ne récupères pas les lignes qui sont seulement dans la table 1.
    Dans ce cas, faites simplement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ON t1.col2 = t2.col2
       OR t2.col2 IS NULL;

Discussions similaires

  1. Jointure externe avec constante
    Par magic charly dans le forum SQL
    Réponses: 2
    Dernier message: 02/05/2007, 10h37
  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