如何查询列A同值分组下所有列B值均为指定值的全部行
实现同组全值匹配的SQL查询方法
核心思路是先筛选出所有列B取值均为指定值的Column A分组,再匹配原表返回对应行即可,以下是3种常见实现方式(示例目标为筛选所有Column B全为failure的分组行,表名为test_table):
方法1:GROUP BY分组子查询 + JOIN匹配
这是兼容性最高的写法,支持所有主流SQL数据库:
SELECT t1.* FROM test_table t1 -- 先拿到符合条件的Column A值 INNER JOIN ( SELECT `Column A` FROM test_table GROUP BY `Column A` -- 校验分组内所有Column B都等于目标值 HAVING COUNT(CASE WHEN `Column B` != 'failure' THEN 1 END) = 0 ) t2 ON t1.`Column A` = t2.`Column A`;
你也可以把HAVING条件替换为MAX(Column B) = 'failure' AND MIN(Column B) = 'failure',逻辑等价:如果组内所有值相同,最大值和最小值必然相等。
方法2:窗口函数实现
适合支持窗口函数的数据库(MySQL 8.0+、PostgreSQL、SQL Server等),不需要多表关联:
WITH group_check AS ( SELECT *, -- 统计每个Column A分组内不符合要求的行数 COUNT(CASE WHEN `Column B` != 'failure' THEN 1 END) OVER (PARTITION BY `Column A`) AS unqualified_count FROM test_table ) SELECT `Column A`, `Column B` FROM group_check -- 不符合行数为0即代表组内全部符合要求 WHERE unqualified_count = 0;
方法3:NOT EXISTS实现
如果Column A建了索引,这个写法的性能表现会更优:
SELECT t1.* FROM test_table t1 WHERE NOT EXISTS ( -- 校验不存在同分组下不符合要求的行 SELECT 1 FROM test_table t2 WHERE t2.`Column A` = t1.`Column A` AND t2.`Column B` != 'failure' );
注意事项
如果你的Column B存在NULL值,需要调整判断条件避免NULL比较失效,比如把Column B != 'failure'改为COALESCE(Column B, '') != 'failure'即可。
内容的提问来源于stack exchange,提问作者Azianese
相关产品推荐
相关产品推荐

