如何修正SQL查询以筛选状态全为Active/Approved的分组?
问题与解决方案
数据表格
| Group_No | Id | Status |
|---|---|---|
| 1 | 101 | Active |
| 1 | 102 | Active |
| 2 | 201 | Active |
| 2 | 202 | Approved |
| 2 | 203 | Active |
| 3 | 301 | Inactive |
| 3 | 302 | Active |
| 4 | 401 | Denied |
| 4 | 402 | Denied |
需求
筛选出所有成员的Status字段值均为Active或Approved的Group_No,期望输出分组1和2。
原查询问题分析
你尝试的SQL查询:
select group_no from <table> where status in ('Active','Approved') group by group_no having(count(distinct status)) = 1;
错误在于having(count(distinct status)) = 1这个条件——它要求分组内只有一种状态值,因此会排除同时包含Active和Approved的分组2,不符合需求。
可行解决方案
方案1:使用NOT EXISTS子查询
通过子查询排除存在不符合状态的分组:
SELECT group_no FROM <table> t_main WHERE NOT EXISTS ( SELECT 1 FROM <table> t_sub WHERE t_sub.group_no = t_main.group_no AND t_sub.status NOT IN ('Active', 'Approved') ) GROUP BY group_no;
方案2:使用HAVING统计不符合状态的数量
通过CASE语句统计分组内不符合条件的记录数,确保数量为0:
SELECT group_no FROM <table> GROUP BY group_no HAVING SUM(CASE WHEN status NOT IN ('Active', 'Approved') THEN 1 ELSE 0 END) = 0;
方案3:使用EVERY函数(部分数据库支持,如PostgreSQL)
如果你的数据库支持EVERY聚合函数,可以直接判断分组内所有记录都满足条件:
SELECT group_no FROM <table> GROUP BY group_no HAVING EVERY(status IN ('Active', 'Approved'));
内容的提问来源于stack exchange,提问作者user9461026
相关产品推荐
相关产品推荐

