如何编写SQL查询获取满足组及条目状态要求的Entry_Number?
解决方案
要满足你提出的三个查询条件,核心是先锁定所有条目状态均为A/R且对应Group_Status为False的组,再从这些组中筛选出状态为A/R的Entry_Number。以下是几种可行的SQL写法:
方法1:使用NOT EXISTS子查询排除无效组
这种写法通过子查询检查当前组是否存在状态非A/R的条目,直接过滤掉不符合条件的组:
SELECT e.Entry_Number FROM Table_E e JOIN Table_G g ON e.Group = g.Group_Number WHERE e.Entry_Status IN ('A', 'R') AND g.Group_Status = FALSE AND NOT EXISTS ( SELECT 1 FROM Table_E e2 WHERE e2.Group = e.Group AND e2.Entry_Status NOT IN ('A', 'R') );
逻辑说明
NOT EXISTS子查询确保当前组内没有任何条目状态为C或I,满足“同组所有条目状态均为A/R”的要求;- 同时结合了条目自身状态校验和组状态为False的条件,一步到位筛选目标数据。
方法2:用CTE预筛选有效组
先通过分组聚合筛选出符合条件的组,再关联原表获取目标条目,逻辑更清晰:
WITH Valid_Groups AS ( SELECT Group FROM Table_E GROUP BY Group -- 统计组内状态非A/R的条目数,等于0表示所有条目都符合要求 HAVING COUNT(CASE WHEN Entry_Status NOT IN ('A', 'R') THEN 1 END) = 0 ) SELECT e.Entry_Number FROM Table_E e JOIN Table_G g ON e.Group = g.Group_Number JOIN Valid_Groups vg ON e.Group = vg.Group WHERE e.Entry_Status IN ('A', 'R') AND g.Group_Status = FALSE;
逻辑说明
Valid_GroupsCTE先筛选出所有条目状态均为A/R的组;- 后续通过JOIN关联,只保留这些组中状态为A/R且组状态为False的条目。
方法3:窗口函数统计无效条目数
利用窗口函数计算每个组内的无效条目数量,再过滤出无效数为0的记录:
SELECT Entry_Number FROM ( SELECT e.Entry_Number, e.Entry_Status, g.Group_Status, -- 按组分区,统计组内状态非A/R的条目总数 SUM(CASE WHEN e2.Entry_Status NOT IN ('A', 'R') THEN 1 ELSE 0 END) OVER (PARTITION BY e.Group) AS invalid_entry_count FROM Table_E e JOIN Table_G g ON e.Group = g.Group_Number JOIN Table_E e2 ON e.Group = e2.Group ) AS filtered_data WHERE Entry_Status IN ('A', 'R') AND Group_Status = FALSE AND invalid_entry_count = 0;
逻辑说明
- 窗口函数
OVER (PARTITION BY e.Group)实现按组统计无效条目数; - 外层查询只保留无效数为0、自身状态符合要求且组状态为False的Entry_Number。
以上三种写法都能满足你的需求,在示例数据中会返回[12,13,14]。
内容的提问来源于stack exchange,提问作者Paul Traumiller
相关产品推荐
相关产品推荐

