在保持Null值的同时连接表

时间:2010-03-31 15:28:52

标签: sql

我有两张桌子:

  • 用户:ID,first_name,last_name
  • Networks:user_id,friend_id,status

我想从users表中选择所有值,但我想显示特定用户的状态(比如id = 2),同时保持其他值为NULL。例如: 如果我有用户:

? first_name  last_name
------------------------
1 John        Smith
2 Tom         Summers
3 Amy         Wilson

在网络中:

user_id   friend_id   status
------------------------------
2         1           friends

我想为所有其他用户搜索John Smith,所以我想得到:

id first_name  last_name   status
------------------------------------
2  Tom         Summers     friends  
3  Amy         Wilson      NULL

我尝试执行LEFT JOIN然后执行WHERE语句,但它没有用,因为它排除了与其他用户有关但不包含此用户的行。

我可以使用UNION语句执行此操作,但我想知道是否可以在没有UNION的情况下执行此操作。

4 个答案:

答案 0 :(得分:4)

您需要将条件纳入ON的{​​{1}}子句。

LEFT JOIN

如果Select u.first_name, u.last_name, n.status From users u Left Join networks n On ( ( n.user_id = 1 And n.friend_id = u.id ) Or ( n.friend_id = 1 And n.user_id = u.id ) Where u.id <> 1 是该用户的朋友,或者此用户是John Smith的朋友,则应该向所有用户(friend除外)和状态John Smith返回。

答案 1 :(得分:3)

您可能不需要WHERE子句,而是将条件放入“LEFT JOIN”后面的“ON”子句中。这应该可以解决你的问题。另外,请确保主表位于左连接的左侧,否则,您应该使用右连接。

答案 2 :(得分:0)

除了上面的(正确)回复之外,这些条件应该放在ON子句中,如果你真的想出于某种原因将它们放在WHERE子句中,只需添加一个条件:值可以为null。

WHERE (networks.friendid = 2 OR networks.friendid IS NULL)

答案 3 :(得分:0)

根据您的描述,应该是将一部分网络加入用户的情况。

select id, first_name, last_name, status
from users u
left join networks n on u.id = n.user_id
                    and n.friend_id = 1
where id <> 1;                          

左连接将保留usersnetworks中没有匹配行的行,并在返回“朋友”状态时添加and n.friend_id = 1限制。最后,您可以选择从users中排除正在运行查询的行。