查询列值相同的所有行:SQL分组查询返回结果不符求助
解决GROUP BY仅返回单条记录,需获取全组所有行的问题
你的问题根源在于**GROUP BY本身的作用是分组聚合**——它会把相同branch_address的行合并成一行,并用聚合函数(比如COUNT(*))计算组内的统计值,所以自然只能返回每组一条记录。而你需要的是找出所有属于那些刚好有10条记录的branch_address组的行,而不是组的统计结果。
这里有两种常用的解决方法:
方法一:使用子查询筛选符合条件的branch_address
先通过子查询找出满足COUNT(*)=10的branch_address,再将这个结果和原关联表进行匹配,获取所有对应的行:
SELECT t1.auction_id, t1.account_no, t1.branch_address FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.aul_id = t2.aul_id WHERE t2.date = '2018-03-20' AND t1.branch_address IN ( -- 子查询找出刚好有10条记录的branch_address SELECT t1_inner.branch_address FROM Table1 t1_inner LEFT JOIN Table2 t2_inner ON t1_inner.aul_id = t2_inner.aul_id WHERE t2_inner.date = '2018-03-20' GROUP BY t1_inner.branch_address HAVING COUNT(*) = 10 );
方法二:使用窗口函数(更高效,推荐)
窗口函数可以在不分组聚合的前提下,计算每个branch_address组内的记录数,然后筛选出组内记录数等于10的行:
SELECT auction_id, account_no, branch_address FROM ( SELECT t1.auction_id, t1.account_no, t1.branch_address, -- 计算当前branch_address组内的总记录数 COUNT(*) OVER (PARTITION BY t1.branch_address) AS group_count FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.aul_id = t2.aul_id WHERE t2.date = '2018-03-20' ) AS subquery WHERE group_count = 10;
注意点:
- 窗口函数
COUNT(*) OVER (PARTITION BY ...)会为每一行标记其所在组的总记录数,不会改变原行的数量,这样就能轻松筛选出符合组大小条件的所有行。 - 如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQL Server等),优先使用方法二,因为它只需要扫描一次表,性能比子查询更优。
内容的提问来源于stack exchange,提问作者bhagya_kz
相关产品推荐
相关产品推荐

