如果“对于uid根本没有任何行”,并且您
JOIN喜欢这样做,那么结果将 不会有任何行 。使用
LEFT [OUTER]JOIN来代替:
SELECt u.uid, u.fname, u.lnameFROM 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)。
我使用
IS DISTINCTFROM而不是
!=在上一个WHERe条件下使用,因为再次
login.access可能是
NULL,这将不符合条件。
但是,由于您似乎只对表中的列感兴趣
u,因此这种替代查询会更优雅:
SELECt u.uid, u.fname, u.lnameFROM uWHERe (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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)