如果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;
OR
基本上是u_org.orgid
行不存在。
答案 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,您需要我添加的括号。 (AND
在OR
之前绑定。
我在最后一个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
);
此替代方案还有一个额外的好处,即即使u
或u_org
中有多行,您始终会从login
获得一行行。< / p>