如果我有两张这样的表:
位置:
loc_id loc_name
1 xx
2 yy
3 zz
群组:
grp_id loc_id
3 2
现在,如果我在那里的小组,我只想要相关的位置,如果不是我想要整个位置表。
我这样查询:
select distinct a.loc_id , a.loc_name
from Location a LEFT join Group b
on a.loc_id = b.loc_id
where (b.grp_id = 3 OR (b.group_id IS NULL))
但是我总是得到所有的位置,因为我使用ORing
答案 0 :(得分:3)
试试这个:
SELECT loc_id, loc_name
FROM Location l
WHERE EXISTS (SELECT *
FROM Group g
WHERE l.loc_id = g.loc_id AND
g.grp_id = 3)
UNION ALL
SELECT loc_id, loc_name
FROM Location
WHERE NOT EXISTS (SELECT *
FROM Location l
JOIN GROUP g ON l.loc_id = g.loc_id
WHERE g.grp_id = 3)
如果指定的Location
存在匹配的Group
条记录,则UNION ALL
操作的第一个查询将返回这些记录。在这种情况下,第二个查询将返回一个空集。
如果没有匹配记录,则第一个查询将返回一个空集,而第二个查询将返回表Location
的所有记录。