如何筛选Table A中对应Table B全为Inactive状态的项
解决思路与SQL实现方案
嘿,你已经找对了方向——GROUP BY确实是可行的路径之一,我给你分享几种实用的实现方法,帮你精准筛选出符合要求的item:
方法一:GROUP BY + HAVING 聚合验证
这种方法的核心是把每个item对应的Table B记录聚合成组,然后验证组内没有任何active=1(活跃)的记录。有两种常见的写法:
写法1:通过最大值判断
因为active只有0和1两种状态,如果某个item的所有记录都是0,那分组后的最大值必然是0;只要有一条是1,最大值就会变成1。
SELECT a.item FROM TableA a JOIN TableB b ON a.item = b.item GROUP BY a.item HAVING MAX(b.active) = 0;
写法2:统计活跃记录数
直接统计分组内active=1的记录数量,只要数量为0,就说明所有记录都是Inactive。
SELECT a.item FROM TableA a JOIN TableB b ON a.item = b.item GROUP BY a.item HAVING COUNT(CASE WHEN b.active = 1 THEN 1 END) = 0;
方法二:NOT EXISTS 反向排除
这种方法逻辑更直观:找出Table A中不存在任何一条对应Table B里active=1记录的item。当表数据量较大时,这种写法的执行效率往往更优。
SELECT a.item FROM TableA a WHERE NOT EXISTS ( SELECT 1 FROM TableB b WHERE b.item = a.item AND b.active = 1 );
补充:处理Table B中无对应记录的情况
如果你的业务场景中,Table B可能存在某个item没有任何记录(即该item在B中无数据),且需要把这类item也纳入结果(默认视为全Inactive),可以调整GROUP BY的写法:
SELECT a.item FROM TableA a LEFT JOIN TableB b ON a.item = b.item GROUP BY a.item HAVING MAX(COALESCE(b.active, 0)) = 0;
这里用COALESCE把NULL(无记录的情况)转换为0,确保这类item也能被筛选出来。
内容的提问来源于stack exchange,提问作者Kuro
相关产品推荐
相关产品推荐

