Oracle SQL如何使用子查询删除Tab1中存在于Tab2的记录
Oracle SQL 获取两表差集的子查询实现方案
原有NOT IN查询未返回预期结果,核心原因是SQL的三值逻辑特性:如果子查询返回的Tab2.ID包含NULL值,NOT IN的所有比较结果都会被判定为「未知」,最终没有符合条件的记录返回。
以下两种子查询方案都可以实现需求:
方案1:改造原有NOT IN逻辑
仅需在子查询中增加非空过滤,排除NULL值即可:
SELECT ID FROM Tab1 WHERE ID NOT IN ( SELECT ID FROM Tab2 WHERE ID IS NOT NULL );
方案2:使用NOT EXISTS子查询(推荐)
该写法不受Tab2.ID存在空值的影响,稳定性和性能表现更优,是业内实现该类需求的通用方案:
SELECT ID FROM Tab1 t1 WHERE NOT EXISTS ( SELECT 1 FROM Tab2 t2 WHERE t2.ID = t1.ID );
两种方案执行后均可得到预期输出:
ID --- 1 2
内容的提问来源于stack exchange,提问作者dingaro
相关产品推荐
相关产品推荐

