89 votes

SQL Server JOIN manque les valeurs NULL

Supposons que je dispose des 2 tableaux suivants :

      Table1:                                Table2:
Col1:      Col2:     Col3:             Col1:       Col2:       Col4:
a          b         c                 a           b           d
e          <null>    f                 e           <null>      g
h          i         j                 h           i           k
l          <null>    m                 l           <null>      n
o          <null>    p                 o           <null>      q

Maintenant, je veux joindre ces tables sur Col1 y Col2 et ramène l'ensemble de l'ensemble à son état initial :

     Result:
Col1:      Col2:     Col3:     Col4:
a          b         c         d
e          <null>    f         g
h          i         j         k
l          <null>    m         n
o          <null>    p         q

Alors, j'ai essayé un SQL comme :

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN Table2
ON Table1.Col1 = Table2.Col1 
AND Table1.Col2 = Table2.Col2

Mais il ne correspond pas à la NULL valeurs en Col2 donc je me retrouve avec :

     Result:
Col1:      Col2:     Col3:     Col4:
a          b         c         d
h          i         j         k

Comment puis-je obtenir le résultat que je recherche ?

Merci !

127voto

Gordon Linoff Points 213350

Vous pouvez être explicite sur les jointures :

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN
     Table2
      ON (Table1.Col1 = Table2.Col1 or Table1.Col1 is NULL and Table2.Col1 is NULL) AND
         (Table1.Col2 = Table2.Col2 or Table1.Col2 is NULL and Table2.Col2 is NULL)

En pratique, je serais plus enclin à utiliser coalesce() dans la condition de jointure :

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN
     Table2
     ON (coalesce(Table1.Col1, '') = coalesce(Table2.Col1, '')) AND
        (coalesce(Table1.Col2, '') = coalesce(Table2.Col2, ''))

'' serait une valeur qui ne figure dans aucune des deux tables.

Juste un mot d'avertissement. Dans la plupart des bases de données, l'utilisation de l'une de ces constructions empêche l'utilisation d'index.

49voto

Dave Hackett Points 547

Utilisez la jointure externe gauche au lieu de la jointure interne pour inclure les lignes contenant des NULS.

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 LEFT OUTER JOIN 
    Table2 ON Table1.Col1 = Table2.Col1 
    AND Table1.Col2 = Table2.Col2

Pour plus d'informations, voir ici : http://technet.microsoft.com/en-us/library/ms190409(v=sql.105).aspx

18voto

sgeddes Points 29837

Essayez d'utiliser ISNULL fonction :

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 
INNER JOIN Table2
   ON Table1.Col1 = Table2.Col1 
   AND ISNULL(Table1.Col2, 'ZZZZ') = ISNULL(Table2.Col2,'ZZZZ')

'ZZZZ' est une valeur arbitraire qui ne figure jamais dans le tableau.

14voto

jap1968 Points 2849

Un piratage sale et rapide :

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN Table2 ON Table1.Col1 = Table2.Col1
 AND ((Table1.Col2 = Table2.Col2) OR (Table1.Col2 IS NULL AND Table2.Col2 IS NULL))

1voto

wiretext Points 2942

Tu peux juste faire une carte comme ça

select * from tableA a
join tableB b on isnull(a.colID,'') = isnull(b.colId,'')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X