如何编写SQL查询获取A与B的交集,B为空时返回A
解决方案
这里有几种实用的写法,能满足你“B非空取交集,B空则返回全A”的需求:
方法一:WHERE子句结合存在性判断
这是最简洁的写法,利用NOT EXISTS判断B是否为空,再通过逻辑分支控制返回结果:
SELECT A.* FROM A WHERE NOT EXISTS (SELECT 1 FROM B) OR EXISTS (SELECT 1 FROM B WHERE B.col = A.col);
逻辑说明:
- 当B为空时,
NOT EXISTS (SELECT 1 FROM B)结果为真,所有A的行都会被返回 - 当B非空时,第一个条件为假,只会筛选出A中
col值在B里存在的行(也就是交集)
方法二:UNION ALL拆分分支
这种写法逻辑更直观,把两种情况拆成两个查询,用UNION ALL合并:
-- 情况1:B为空时返回全A SELECT A.* FROM A WHERE NOT EXISTS (SELECT 1 FROM B) UNION ALL -- 情况2:B非空时返回A和B的交集 SELECT A.* FROM A JOIN B ON A.col = B.col WHERE EXISTS (SELECT 1 FROM B);
优势是两个分支完全独立,不会互相干扰,而且UNION ALL比UNION性能更好(因为不需要去重)。
方法三:结合INTERSECT的写法
如果你习惯用INTERSECT取交集,可以搭配UNION ALL和空集判断:
-- 取A和B的交集(B非空时生效) SELECT * FROM A INTERSECT SELECT * FROM B UNION ALL -- B为空时返回全A SELECT * FROM A WHERE NOT EXISTS (SELECT 1 FROM B);
注意:INTERSECT会自动去重,如果你的A表存在重复行,这种写法返回的交集结果会是去重后的,而用JOIN的写法会保留重复(取决于B中匹配的行数),根据你的实际需求选择即可。
内容的提问来源于stack exchange,提问作者okapies
相关产品推荐
相关产品推荐

