两表关联:保留仅存在于TableB而非TableA的记录
解决方案:提取TableB独有的记录
示例数据
TableA
| ID | Name |
|---|---|
| 1 | BOB |
| 2 | JOS |
TableB
| ID | Name |
|---|---|
| 1 | BOB |
| 2 | JOS |
| 3 | JEF |
预期输出
| ID | Name |
|---|---|
| 3 | JEF |
下面是几种通用的SQL实现方案:
方法1:LEFT JOIN + IS NULL(跨数据库通用)
这是最兼容的写法,几乎所有关系型数据库都支持:
SELECT b.ID, b.Name FROM TableB b LEFT JOIN TableA a ON b.ID = a.ID WHERE a.ID IS NULL;
原理:用左连接保留TableB的所有记录,筛选出TableA中匹配不到的条目(即a.ID为NULL的行),就是TableB独有的数据。
方法2:NOT EXISTS(性能友好)
如果你的数据库支持子查询,这种写法在有索引的情况下性能更优:
SELECT b.ID, b.Name FROM TableB b WHERE NOT EXISTS ( SELECT 1 FROM TableA a WHERE a.ID = b.ID );
原理:逐条检查TableB的记录,只要在TableA中找不到对应ID的,就保留这条记录。
方法3:EXCEPT/MINUS(部分数据库支持)
针对SQL Server、PostgreSQL等支持EXCEPT的数据库,或者Oracle的MINUS,可以用更简洁的集合运算:
-- SQL Server/PostgreSQL 写法 SELECT ID, Name FROM TableB EXCEPT SELECT ID, Name FROM TableA; -- Oracle 写法 SELECT ID, Name FROM TableB MINUS SELECT ID, Name FROM TableA;
原理:直接取TableB的结果集减去TableA的结果集,得到的就是TableB独有的数据。注意EXCEPT会自动去重,若要保留重复记录,可改用EXCEPT ALL。
内容的提问来源于stack exchange,提问作者Kris
相关产品推荐
相关产品推荐

