2013-01-16 132 views
32

假設我有以下2個表:SQL服務器加入失蹤NULL值

 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 

現在,我想加入上Col1Col2這些表,並帶回整套的樣子:

 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 

於是,我試着像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 

但它不匹配日ËNULLCol2值,所以我結束了:

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

我怎樣才能得到我要尋找的結果?

謝謝!

回答

45

您可以更明確一些聯接:

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) 

在實踐中,我會更容易在連接條件使用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, '')) 

''將是一個值不任一表格。

只是一句謹慎。在大多數數據庫中,使用這些結構中的任何一個都會阻止使用索引。

+1

喜@戈登 - linoff,你的答案是最珍貴的在這種情況下。非常感謝 –

10

嘗試使用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') 

哪裏'ZZZZ'是一些任意值從來沒有在表中。

+5

這引入了我想要避免的魔術值,除非絕對必要 –

+0

這會很好地工作,但假定'0'不在另一行的其他地方使用。 – PinnyM

+0

是的,我更喜歡@戈登的回答,只是提供一個替代方案。我可能會使用一個不同的值,我知道不能在'ZZZZ'之類的返回值中表示:-) – sgeddes

5

髒,快速劈:

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)) 
+0

謝謝,@Jap - 正是我在找的東西...... Gordon擊敗了你,但謝謝你回答! –

16

使用左外連接,而不是內部加入到包括與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 

欲瞭解更多信息,請參見這裏:http://technet.microsoft.com/en-us/library/ms190409(v=sql.105).aspx

+0

適合我。簡單而乾淨。 – Kuvalya

+0

這並不回答原來的問題。如果找不到匹配項,您的解決方案將包含table2的空行。看看OP的問題 – AaA

+0

這兩個表中的第二行爲我工作..謝謝! –

-1

你可以像那樣的地圖

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