优化SQL合并查询结果语句:避免两次扫描数据表的方法
更高效的单扫描分组求和方案
当然有更优的实现方式!你原来的查询用了UNION两次扫描数据表,确实会带来额外的性能开销。我们可以通过一次扫描+条件分组的方式完成需求,具体SQL如下:
SELECT CASE WHEN column1 < 3 THEN CAST(column1 AS VARCHAR) ELSE '3+' END AS id, SUM(count1) AS `sum(count1)` FROM test GROUP BY CASE WHEN column1 < 3 THEN CAST(column1 AS VARCHAR) ELSE '3+' END ORDER BY id;
为什么这个方法更高效?
这个查询只对test表做一次全表扫描:
- 通过
CASE WHEN逻辑把数据分成两组:column1小于3的保留原数值(转成字符串是为了和'3+'统一数据类型),大于等于3的统一标记为'3+' - 直接基于这个分组规则聚合求和,避免了两次扫描和结果集合并的开销
优化排序(可选)
如果需要保证结果按1→2→3+的顺序输出(避免字符串排序可能出现的问题),可以给ORDER BY加一个辅助排序条件:
SELECT CASE WHEN column1 < 3 THEN CAST(column1 AS VARCHAR) ELSE '3+' END AS id, SUM(count1) AS `sum(count1)` FROM test GROUP BY CASE WHEN column1 < 3 THEN CAST(column1 AS VARCHAR) ELSE '3+' END ORDER BY CASE WHEN column1 < 3 THEN column1 ELSE 3 END;
这样排序时,数值1、2会优先于3+展示,结果顺序更符合预期。
内容的提问来源于stack exchange,提问作者Waleed
相关产品推荐
相关产品推荐

