SQL如何查询仅含CodeID为B且无对应CodeID为A的关联记录
SQL查询解法
方法1:NOT EXISTS 实现(推荐,逻辑最直观)
直接对应你描述的「存在B且同ExternID下不存在A」的逻辑,代码如下:
SELECT Id, ExternID, CodeID FROM t t_b WHERE t_b.CodeID = 'B' AND NOT EXISTS ( SELECT 1 FROM t t_a WHERE t_a.ExternID = t_b.ExternID AND t_a.CodeID = 'A' );
执行后会直接返回你预期的Id=4的结果。
方法2:分组聚合实现
如果需要批量统计所有符合要求的ExternID,可使用分组筛选的写法:
SELECT MAX(Id) Id, ExternID, 'B' CodeID FROM t GROUP BY ExternID HAVING COUNT(CASE WHEN CodeID = 'A' THEN 1 END) = 0 AND COUNT(CASE WHEN CodeID = 'B' THEN 1 END) >= 1;
方法3:LEFT JOIN 实现
部分数据库引擎对JOIN的优化更好,可选用这种写法:
SELECT t_b.Id, t_b.ExternID, t_b.CodeID FROM t t_b LEFT JOIN t t_a ON t_a.ExternID = t_b.ExternID AND t_a.CodeID = 'A' WHERE t_b.CodeID = 'B' AND t_a.Id IS NULL;
内容的提问来源于stack exchange,提问作者axelsven
相关产品推荐
相关产品推荐

