我想获取数据,orgid = 2如果有或根本没有任何行uid。orgid是一个integer。我能想到的最接近的方法是执行操作,IS NULL但是我没有获取uid没有orgid行的数据。任何的想法?
orgid = 2
uid
orgid
integer
IS NULL
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行不存在,则为is 。
OR
u_org.orgid
如果“对于uid根本没有任何行”,并且您JOIN喜欢这样做,那么结果将 不会有任何行 。使用 LEFT [OUTER] JOIN 来代替:
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;
另外,由于 运算符priority ,您需要添加括号。(AND在之前绑定OR)。
AND
我使用IS DISTINCT FROM而不是!=在上一个WHERE条件下使用,因为再次login.access可能是NULL,这将不符合条件。
IS DISTINCT FROM
!=
login.access
NULL
但是,由于您似乎只对表中的列感兴趣u,因此这种替代查询会更优雅:
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 );
这种替代具有额外的优势,你总能得到 一个 来自行u,即使有在多行u_org或login。
u_org
login