2014-01-23 56 views
0

我有兩個MySql表:contractscustomers。客戶可能有合同鏈接到他們。有些合同存在沒有客戶,有些客戶沒有合同。我需要查詢所有客戶和合同,並在可能的情況下將其加入同一行。在沒有找到合同或客戶的行中,我想簡單地放置NULLMySQL在失敗JOIN上返回NULL

就目前而言,我只返回兩行都存在的行。我意識到這是一個連接,但我不知道如何簡單地返回所有內容。指定沒有JOIN子句會多次返回每個結果,這也不會。

這裏的SQL不夠我到目前爲止:

SELECT cu.ID, cu.`Name`, cu.Contract, co.ID, co.`Type` 
FROM test.customers cu 
INNER JOIN test.contracts co ON co.ID = cu.Contract; 

任何幫助將不勝感激。

+1

您正在尋找MySQL不支持的'full outer join'。 –

回答

2

你所感興趣的東西被稱爲「左連接」。

SELECT cu.ID, cu.`Name`, cu.Contract, co.ID, co.`Type` 
FROM test.customers cu 
LEFT JOIN test.contracts co ON co.ID = cu.Contract; 

這將返回沒有匹配的合同的空值。

但是,那也不會找到「無客戶」的實例。

解決方法是添加第二個查詢和聯合。

UNION 
SELECT cu.ID, cu.`Name`, cu.Contract, co.ID, co.`Type` 
FROM test.contracts co 
LEFT JOIN test.customers cu ON co.ID = cu.Contract 
WHERE cu.ID is null; 
+0

正是我需要的。非常感謝。 –

3
SELECT 
    cu.ID, 
    cu.`Name`, 
    cu.Contract, 
    co.ID, 
    co.`Type` 
FROM 
    test.customers cu 
    LEFT JOIN test.contracts co 
    ON co.ID = cu.Contract ; 

,反之亦然辦得到相反的