SQL Server Join相关问题:筛选未全部为Approved状态的SectionId
实现方案
你可以用分组聚合加HAVING条件过滤,也可以用EXISTS子查询实现需求,两种实现都能兼容MySQL、PostgreSQL、SQL Server等主流SQL版本。
方案1:分组聚合实现
写法更简洁,适合需要同时统计其他分组指标的场景,假设你的表名为section_info,语句如下:
SELECT SectionId FROM section_info GROUP BY SectionId -- 仅保留存在至少1条非Approved状态的SectionId HAVING COUNT(CASE WHEN SectionStatus <> 'Approved' THEN 1 END) > 0;
逻辑说明
按SectionId分组后,CASE WHEN会把非Approved的记录标记为1,其余为NULL;COUNT统计时会忽略NULL值,统计结果大于0就说明该分组存在非Approved的记录,符合筛选要求。
方案2:EXISTS子查询实现
如果数据量较大且SectionId建有索引,该方案查询效率更高:
SELECT DISTINCT SectionId FROM section_info t1 WHERE EXISTS ( SELECT 1 FROM section_info t2 WHERE t2.SectionId = t1.SectionId AND t2.SectionStatus <> 'Approved' );
逻辑说明
只要某一个SectionId存在任意一条状态不是Approved的记录时,就会被查询返回,DISTINCT用来去重,避免同一个SectionId返回多次。
测试验证
两组测试数据执行后返回结果完全符合预期:
- 第一组测试数据返回:1、2、3
- 第二组测试数据返回:2、3
内容的提问来源于stack exchange,提问作者Ruchir
相关产品推荐
相关产品推荐

