如何获取TableA全量数据与TableB中id未存在于TableA的数据
如何获取TableA全量数据及TableB中未在TableA出现的ID对应数据?
表结构与需求
Table A:
id, name 1, 'John'
Table B:
id, name 1, 'Doe', 2, 'Name 1'
需求:获取TableA的全部数据,加上TableB中id未在TableA里出现的数据,期望结果:
1, 'John' 2, 'Name 1'
你的SQL错误分析
你之前的语句存在语法和逻辑问题:
- 第一个语句中
NOT IN TableA.id语法错误,NOT IN后需跟子查询(SELECT id FROM TableA),且整体UNION+EXCEPT的逻辑不符合需求,会错误过滤数据。 - 第二个语句中
UNION后直接加WHERE属于语法错误,UNION连接的两个查询需各自处理条件,不能统一在末尾加过滤规则。
正确实现方式
以下几种方法都可以实现需求,优先推荐第一种:
方法1:UNION ALL + NOT EXISTS(最稳妥,无NULL值隐患)
-- 取TableA全量数据 SELECT id, name FROM TableA UNION ALL -- 取TableB中ID未在TableA出现的数据 SELECT id, name FROM TableB b WHERE NOT EXISTS ( SELECT 1 FROM TableA a WHERE a.id = b.id ) ORDER BY id;
方法2:UNION ALL + NOT IN(注意:若TableA的id可能为NULL,此方法会失效)
SELECT id, name FROM TableA UNION ALL SELECT id, name FROM TableB WHERE id NOT IN (SELECT id FROM TableA) ORDER BY id;
方法3:LEFT JOIN筛选TableB数据
SELECT id, name FROM TableA UNION ALL SELECT b.id, b.name FROM TableB b LEFT JOIN TableA a ON b.id = a.id WHERE a.id IS NULL ORDER BY id;
说明
- 使用
UNION ALL而非UNION:因为筛选后的TableB数据和TableA数据不会有重复ID,UNION ALL无需去重,性能更优。 NOT EXISTS比NOT IN更安全:当TableA的id存在NULL值时,NOT IN会返回空结果,而NOT EXISTS不受影响。
内容的提问来源于stack exchange,提问作者Jay.
相关产品推荐
相关产品推荐

