如何从GROUP BY分组结果中获取address_1列为NULL的行的id值
实现方案
你可以通过以下两种常见方式获取目标id,适配不同的数据库版本需求:
方案1:子查询匹配分组(兼容所有支持标准SQL的数据库)
先通过子查询筛选出符合COUNT(id) > 1要求的address_2 + address_3分组,再在外层筛选这些分组中address_1为NULL的行即可:
SELECT id FROM `table` WHERE address_1 IS NULL AND (address_2, address_3) IN ( SELECT address_2, address_3 FROM `table` GROUP BY address_2, address_3 HAVING COUNT(id) > 1 );
注意:如果你的数据表中
address_1空值是空字符串而非NULL,把address_1 IS NULL替换为address_1 = ''即可。
方案2:窗口函数(适配MySQL8.0+、PostgreSQL、SQL Server等支持窗口函数的数据库)
仅需单次扫描数据表即可得到结果,数据量较大时执行效率更高:
WITH group_stat AS ( SELECT id, address_1, COUNT(*) OVER (PARTITION BY address_2, address_3) AS group_size FROM `table` ) SELECT id FROM group_stat WHERE address_1 IS NULL AND group_size > 1;
两种方案执行后返回的id就是你示例中2、4这类符合要求的记录id,可直接用于后续的更新/删除操作。
内容的提问来源于stack exchange,提问作者tarako
相关产品推荐
相关产品推荐

