SQL Server JOIN缺少NULL值

Joh*_*tos 55 sql sql-server

假设我有以下2个表:

      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
Run Code Online (Sandbox Code Playgroud)

现在,我想加入这些表上Col1,并Col2带回整套的样子:

     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
Run Code Online (Sandbox Code Playgroud)

所以,我尝试了一个SQL:

SELECT Table1.Col1, Table1.Col2, Table1.Col3, Table2.Col4
FROM Table1 INNER JOIN Table2
ON Table1.Col1 = Table2.Col1 
AND Table1.Col2 = Table2.Col2
Run Code Online (Sandbox Code Playgroud)

但它不匹配的NULLCol2,所以我最终得到:

     Result:
Col1:      Col2:     Col3:     Col4:
a          b         c         d
h          i         j         k
Run Code Online (Sandbox Code Playgroud)

我怎样才能得到我想要的结果?

谢谢!

Gor*_*off 81

您可以明确关于连接:

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)
Run Code Online (Sandbox Code Playgroud)

在实践中,我更有可能coalesce()在连接条件中使用:

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, ''))
Run Code Online (Sandbox Code Playgroud)

哪个''值不在任何一个表中.

只是提醒一句.在大多数数据库中,使用任何这些构造都会阻止使用索引.

  • 合并的另一个选项是`ON(T1.C1 = T2.C1或(coalesce(T1.C1,T2.C1)为null))和(T1.C2 = T2.C2或(coalesce(T1.C2,T2 .C2)为空))` (2认同)

小智 29

使用Left Outer Join而不是Inner Join来包含具有NULLS的行.

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
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此处:http://technet.microsoft.com/en-us/library/ms190409(v = sql.105).aspx

  • 这不符合原始问题.如果找不到匹配项,您的解决方案将包含table2的空行.在OP的问题中查看两个表中的第二行 (5认同)
  • 感谢您的好建议,这就是我所需要的。我的情况是 Table.Col1 为空,而 Table2 中根本没有空记录,因此根本没有选择具有空 col 的行。 (2认同)

sge*_*des 17

尝试使用ISNULL功能:

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')
Run Code Online (Sandbox Code Playgroud)

'ZZZZ'在表中从未有的任意值.

  • 除非绝对必要,否则这会引入我倾向于避免的魔法值 (6认同)

jap*_*968 9

肮脏而快速的黑客攻击:

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))
Run Code Online (Sandbox Code Playgroud)