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

use*_*223 6 sql postgresql null left-join

如果orgid = 2或者根本没有行,我想获取数据uid.orgid是一个integer.我能想到的最接近的事情就是做,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;
Run Code Online (Sandbox Code Playgroud)

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

Erw*_*ter 6

如果"uid没有任何行",并且你JOIN喜欢你,那么你就得不到任何结果.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;
Run Code Online (Sandbox Code Playgroud)

此外,由于运算符优先级,您需要我添加的括号.(AND之前绑定OR).

我使用IS DISTINCT FROM而不是!=在最后一个WHERE条件,因为,再次,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
   );
Run Code Online (Sandbox Code Playgroud)

这种替代具有额外的优势,你总能得到一个来自行u,即使有在多行u_orglogin.