SQL:如何筛选无对等值记录及全外连接中ID不匹配条目
SQL中筛选无对等值记录的方法
针对你的两个问题,我来一步步拆解说明:
1. 解决你当前的FULL OUTER JOIN场景需求
你已经用FULL OUTER JOIN关联了两张表,现在要只保留两边ID不匹配的条目,其实只需要在查询末尾加一个WHERE条件过滤掉匹配的记录就行:
SELECT * FROM tableA FULL OUTER JOIN tableB ON tableA.ID = tableB.ID WHERE tableA.ID IS NULL OR tableB.ID IS NULL;
为什么这么写?
- 当
tableA里的记录在tableB找不到对应ID时,tableB的所有字段(包括ID)都会返回NULL - 反过来,
tableB里的记录在tableA找不到对应ID时,tableA的ID会返回NULL - 用
OR就能同时捕获这两种“无对等匹配”的情况,精准筛选出你要的结果
2. 通用场景:如何显示不存在对等值的记录
根据不同的需求,有几种常用方法:
方法一:找单表中在另一表无匹配的记录
比如要找tableA里所有在tableB没有对应ID的记录,用LEFT JOIN+WHERE是最直观的写法:
SELECT tableA.* FROM tableA LEFT JOIN tableB ON tableA.ID = tableB.ID WHERE tableB.ID IS NULL;
也可以用NOT EXISTS子查询,逻辑更清晰,部分数据库下性能表现也不错:
SELECT * FROM tableA WHERE NOT EXISTS ( SELECT 1 FROM tableB WHERE tableB.ID = tableA.ID );
方法二:同时找两张表中互相无匹配的记录
这就是你当前的场景,除了用FULL OUTER JOIN+WHERE,如果你的数据库不支持FULL OUTER JOIN(比如MySQL),可以用UNION来模拟:
-- MySQL中模拟全连接取不匹配记录 SELECT tableA.*, tableB.* FROM tableA LEFT JOIN tableB ON tableA.ID = tableB.ID WHERE tableB.ID IS NULL UNION SELECT tableA.*, tableB.* FROM tableB LEFT JOIN tableA ON tableB.ID = tableA.ID WHERE tableA.ID IS NULL;
内容的提问来源于stack exchange,提问作者Viraj Kulkarni
相关产品推荐
相关产品推荐

