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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:11:36