如何查询表B中与表A无匹配ID的数据?SQL查询求助
解决方案:查询Table_2中未匹配Table_1的ID
首先你当前的UNION语句写法有误,正确的合并两个表ID的写法应该是:
SELECT ID FROM Table_1 UNION SELECT ID FROM Table_2
但UNION只是合并两个结果集并去重,完全不符合你要找"Table_2中未与Table_1匹配的ID"的需求。下面是几种可行的正确写法:
方法1:LEFT JOIN + IS NULL(兼容性最强)
这种方法适用于所有主流数据库(MySQL、SQL Server、PostgreSQL等):
SELECT t2.ID FROM Table_2 t2 LEFT JOIN Table_1 t1 ON t2.ID = t1.ID WHERE t1.ID IS NULL;
逻辑:把Table_2左连接到Table_1,保留Table_2的所有行,匹配不到Table_1的行中t1.ID会是NULL,过滤出这些行就是目标数据。
方法2:NOT EXISTS(逻辑清晰)
这种写法可读性高,很多数据库会对其做优化:
SELECT ID FROM Table_2 t2 WHERE NOT EXISTS ( SELECT 1 FROM Table_1 t1 WHERE t1.ID = t2.ID );
逻辑:检查Table_2中的每一行ID,在Table_1中不存在匹配项的就保留。
方法3:NOT IN(注意NULL陷阱)
如果Table_1的ID列不存在NULL值,可以用这种写法:
SELECT ID FROM Table_2 WHERE ID NOT IN (SELECT ID FROM Table_1);
⚠️ 注意:如果Table_1的ID有NULL,这个查询会返回空结果,因为NOT IN遇到NULL会导致所有条件不成立。
方法4:EXCEPT(部分数据库支持)
你提到用EXCEPT没成功,可能是写法不对。正确的EXCEPT用法是取两个结果集的差集,只保留第一个集合中不在第二个集合里的记录:
SELECT ID FROM Table_2 EXCEPT SELECT ID FROM Table_1;
注意:EXCEPT会自动去重,且不同数据库的支持情况不同(比如MySQL 8.0+才支持,SQL Server、PostgreSQL原生支持)。
结合你给出的表数据,Table_1和Table_2的ID完全一致,所以以上所有查询都会返回空结果,这是符合预期的。
内容的提问来源于stack exchange,提问作者corrupt_door
相关产品推荐
相关产品推荐

