如何查询SUPPORT表中pmi与transactionid组合不存在于CDETAILS表的pmi值
SQL实现方案:提取CDETAILS无匹配的SUPPORT表pmi值
核心需求为校验SUPPORT表的(pmi, transactionid)字段组合是否存在于CDETAILS表,返回无匹配记录对应的pmi值,可通过以下三种常用方案实现:
方案1:LEFT JOIN 左连接实现(全数据库兼容)
对SUPPORT表左关联CDETAILS,关联条件为两个字段同时相等,筛选关联后CDETAILS匹配字段为空的记录即可得到目标数据,兼容所有主流SQL数据库。
SELECT s.pmi FROM SUPPORT s LEFT JOIN CDETAILS c ON s.pmi = c.pmi AND s.transactionid = c.transactionid WHERE c.pmi IS NULL; -- 如果需要返回去重的pmi,把第一行改成 SELECT DISTINCT s.pmi
方案2:NOT EXISTS 子查询实现(大表性能更优)
逐行校验SUPPORT的记录是否在CDETAILS中存在匹配组合,不存在则返回对应pmi,多数数据库优化器对该语法的执行效率更高,适合数据量较大的场景。
SELECT s.pmi FROM SUPPORT s WHERE NOT EXISTS ( SELECT 1 FROM CDETAILS c WHERE c.pmi = s.pmi AND c.transactionid = s.transactionid ); -- 同样需要去重的话添加DISTINCT:SELECT DISTINCT s.pmi
方案3:NOT IN 实现(仅推荐双字段非空场景使用)
注意如果CDETAILS表的pmi或transactionid存在NULL值,该语法会返回空结果,使用前需确认两个字段均为非空约束。
SELECT pmi FROM SUPPORT WHERE (pmi, transactionid) NOT IN ( SELECT pmi, transactionid FROM CDETAILS );
内容的提问来源于stack exchange,提问作者Kkunnuthara
相关产品推荐
相关产品推荐

