You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 09:00:56