2012-04-24 61 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