如何编写SQL查询表A中关联表B记录仅满足条件C的主键
原有写法错误原因
你之前的SQL仅过滤了B表中不满足条件C的关联记录,只要A表主键存在任意一条满足C的关联记录就会被返回,无法排除「同时存在满足和不满足C的关联记录」的主键,因此不符合需求。
可行实现方案
方案1:GROUP BY + HAVING 统计校验(性能更优,适合数据量较大的场景)
SELECT A.id FROM A INNER JOIN B ON A.id = B.id_A GROUP BY A.id -- 校验所有关联的B表记录都满足条件C,不存在例外 HAVING COUNT(CASE WHEN B.value2 <> 'M' THEN 1 END) = 0;
逻辑说明:按A表主键分组后,统计每组中不满足条件C的记录数,统计结果为0则代表该主键对应的所有B表关联记录都符合要求。INNER JOIN自动过滤了没有B表关联记录的A表主键,完全匹配需求。
方案2:NOT EXISTS 逻辑判断(可读性更高,逻辑更直观)
SELECT DISTINCT A.id FROM A WHERE -- 保证A表主键在B表存在关联记录 EXISTS (SELECT 1 FROM B WHERE B.id_A = A.id) -- 保证不存在任何不满足条件C的关联记录 AND NOT EXISTS (SELECT 1 FROM B WHERE B.id_A = A.id AND B.value2 <> 'M');
两种方案执行后都可以得到预期结果,仅返回id=3。
内容的提问来源于stack exchange,提问作者weirdgyn
相关产品推荐
相关产品推荐

