如何筛选TABLE_1关联TABLE_2后Status全为'A'的唯一ID?
问题分析与解决方案
原SQL的问题出在JOIN条件里提前过滤了b.status='A'——这直接导致后续分组统计时,只能看到该ID下Status为'A'的记录,完全忽略了TABLE_2中同一ID下存在非'A'状态的情况。比如ID=2在TABLE_2里有一条Status='B'的记录,但JOIN时只取了Status='A'的那条,分组后SUM的A数量等于当前count(*)(也就是1),自然会被错误地包含进结果。
要实现需求,需要同时满足两个核心条件:
- TABLE_1中每条(ID,Gen_ID)都能在TABLE_2中找到匹配项(确保关联关系成立)
- 该ID在TABLE_2中所有对应的Status全为'A'
正确写法示例
写法一:先排除有非A状态的ID,再关联TABLE_1
SELECT DISTINCT a.ID FROM TABLE_1 a INNER JOIN TABLE_2 b ON a.ID = b.ID AND a.Gen_ID = b.Gen_ID WHERE a.ID NOT IN ( SELECT DISTINCT ID FROM TABLE_2 WHERE Status != 'A' );
写法二:分组验证所有状态均为A,同时确保TABLE_1的记录全匹配
SELECT a.ID FROM TABLE_1 a INNER JOIN TABLE_2 b ON a.ID = b.ID AND a.Gen_ID = b.Gen_ID GROUP BY a.ID -- 确保TABLE_1中该ID的所有Gen_ID都在TABLE_2中匹配到 HAVING COUNT(DISTINCT a.Gen_ID) = (SELECT COUNT(DISTINCT Gen_ID) FROM TABLE_1 WHERE ID = a.ID) -- 确保该ID在TABLE_2中没有非A状态 AND MAX(b.Status) = 'A' AND MIN(b.Status) = 'A';
写法三:用分组统计非A数量为0
SELECT DISTINCT a.ID FROM TABLE_1 a INNER JOIN TABLE_2 b ON a.ID = b.ID AND a.Gen_ID = b.Gen_ID GROUP BY a.ID HAVING SUM(CASE WHEN b.Status != 'A' THEN 1 ELSE 0 END) = 0 -- 额外验证TABLE_1的Gen_ID全匹配TABLE_2(如果需求要求TABLE_1的每条记录都必须在TABLE_2有对应) AND COUNT(DISTINCT a.Gen_ID) = (SELECT COUNT(DISTINCT Gen_ID) FROM TABLE_1 WHERE ID = a.ID);
关键说明
- 如果默认TABLE_1的所有(ID,Gen_ID)都一定存在于TABLE_2中,可去掉最后验证Gen_ID数量的条件;若需严格确保匹配,必须保留。
- 原SQL的
DISTINCT和GROUP BY重复,分组后直接选a.ID即可,不需要DISTINCT。
内容的提问来源于stack exchange,提问作者Boosted Nero
相关产品推荐
相关产品推荐

