查询外键列可以为NULL的位置

时间:2012-11-29 02:52:12

标签: sql postgresql null left-join

如果orgid = 2uid根本没有行,我想获取数据。 orgidinteger。我能想到的最接近的事情是IS NULL,但我没有获得没有uid行的orgid的数据。有什么想法吗?

select u.uid,u.fname,u.lname from u 
inner join u_org on u.uid = u_org.uid 
inner join login on u.uid = login.uid 
where u_org.orgid=2 or u_org.orgid is NULL 
and login.access != 4;

OR基本上是u_org.orgid行不存在。

1 个答案:

答案 0 :(得分:6)

如果“uid完全没有行”,并且你JOIN就像你那样,那么你得到 no row 。请改用LEFT [OUTER] JOIN

SELECT u.uid, u.fname, u.lname
FROM   u 
LEFT   JOIN u_org o ON u.uid = o.uid 
LEFT   JOIN login l ON u.uid = l.uid 
WHERE (o.orgid = 2 OR o.orgid IS NULL)
AND    l.access IS DISTINCT FROM 4;

此外,由于operator precedence,您需要我添加的括号。 (ANDOR之前绑定。

我在最后一个WHERE条件中使用IS DISTINCT FROM而不是!=,因为login.access可能是NULL,这不符合条件。

但是,由于您似乎只对表u中的列感兴趣,因此这个替代查询会更优雅:

SELECT u.uid, u.fname, u.lname
FROM   u
WHERE (u.uid IS NULL OR EXISTS (
   SELECT 1
   FROM   u_org o
   WHERE  o.uid = u.uid
   AND    o.orgid = 2
   ))
AND NOT EXISTS (
   SELECT 1
   FROM   login l
   WHERE  l.uid = u.uid
   AND    l.access = 4
   );

此替代方案还有一个额外的好处,即即使uu_org中有多行,您始终会从login获得一行行。< / p>