如何筛选包含至少一行isrequired或isreleased为1的分组数据?
解决方法
你的需求是获取所有id分组中,至少存在一行isrequired或isreleased为1的所有行。原查询的问题在于错误地将所有字段都加入了GROUP BY,导致无法对整个id分组进行判断。以下是几种可行的调整方案:
方案1:子查询筛选符合条件的ID后关联
先找出满足条件的id,再查询这些id对应的所有行:
SELECT id, name, isrequired, isreleased FROM testtable WHERE id IN ( SELECT DISTINCT id FROM testtable WHERE isrequired = 1 OR isreleased = 1 );
方案2:使用EXISTS子查询
通过EXISTS判断当前行的id分组是否存在符合条件的记录:
SELECT t1.id, t1.name, t1.isrequired, t1.isreleased FROM testtable t1 WHERE EXISTS ( SELECT 1 FROM testtable t2 WHERE t2.id = t1.id AND (t2.isrequired = 1 OR t2.isreleased = 1) );
方案3:窗口函数(适用于SQL Server 2012及以上版本)
用窗口函数计算每个id分组内是否存在符合条件的记录,再筛选结果:
SELECT id, name, isrequired, isreleased FROM ( SELECT id, name, isrequired, isreleased, MAX(CASE WHEN isrequired =1 OR isreleased=1 THEN 1 ELSE 0 END) OVER (PARTITION BY id) AS has_valid_row FROM testtable ) AS sub WHERE has_valid_row =1;
原查询问题分析
原语句中GROUP BY id, name, isrequired, isreleased会将每一行作为独立分组,HAVING条件只能判断当前行是否满足isrequired或isreleased为1,无法覆盖整个id分组的情况,因此无法得到预期结果。
内容的提问来源于stack exchange,提问作者Gauravsa
相关产品推荐
相关产品推荐

