2012-04-24 66 views
2

我想要做這樣的事情列:JOIN對可能包含NULL

SELECT 
    Users.id, 
    Countries.name 
FROM 
    Users, Countries 
WHERE 
    Users.country_id = Countries.id 

的問題是Users.country_id有時是NULL,如果它是不返回整個行。我希望它返回該行,但在該列中使用'null'或''。我嘗試這樣做:

SELECT 
    Users.id, 
    Countries.name 
FROM 
    Users, Countries 
WHERE 
    (Users.country_id = Countries.id OR Users.country_id IS NULL) 

然而,一旦每個 * Countries.id * 存在返回該行。我如何解決這個問題?

+1

您可以使用外部連接。 – Murtaza 2012-04-24 10:19:45

回答

6
SELECT users.id, countries.name 
FROM users 
LEFT JOIN 
     countries 
ON  countries.id = users.country_id 

這是爲什麼ANSI連接語法(使用JOIN關鍵字)是優選的一個很好的例子。

+0

該死!打敗我吧。 :p – weenoid 2012-04-24 10:22:08

+0

謝謝。這工作。出於好奇,我也嘗試了'左外聯合',它也起作用。 – alnafie 2012-04-24 10:31:12

+3

@alnafie:'OUTER'是純粹的語法糖。 – Quassnoi 2012-04-24 10:33:06

2
SELECT   Users.id, 
       Countries.name 
FROM   Users 
LEFT OUTER JOIN Countries ON Users.country_id = Countries.id 
0
SELECT 
    Users.id, 
    Countries.name 
FROM 
    Users, Countries 
WHERE 
    Users.country_id = Countries.id 
UNION 
SELECT 
    id, 
    '{{no country}}' AS name 
FROM 
    Users 
WHERE 
    NOT EXISTS (SELECT * 
        FROM Countries 
       WHERE Users.country_id = Countries.id); 
+0

'UNION'會做不必要的工作來消除重複。應使用UNION ALL。但是,整個查詢是不確定的,存在OUTER JOINS並且mysql支持它。 – 2012-04-24 12:57:36

+0

@FlorinGhita:「整個查詢是無意義的[原文如此]」 - 你似乎暗示使用'OUTER JOIN'是必要的:謹慎地證明它? 「OUTER JOIN」無論如何都是一種聯合,明確地設計爲產生空值,我更願意避免空值。 – onedaywhen 2012-04-24 13:03:39