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

如何获取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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:05:20