如何在不重跑复杂嵌套SQL的前提下为查询结果新增perc列总和列
实现方案
你可以通过窗口函数或者CTE复用原查询结果的方式实现需求,两种方案都不会重复执行内层的复杂嵌套查询。
方案1:窗口函数(推荐,性能最优)
直接在原查询基础上新增窗口聚合列即可:
select descr, sum(percentage) as perc, sum(sum(percentage)) over () as `sum` from ( COMPLEX QUERY HERE) as A group by descr order by perc desc
原理:SQL执行时内层复杂查询仅会执行一次,GROUP BY计算出所有perc值后,窗口函数sum() over()直接基于聚合后的完整结果集计算总和,无额外查询开销。
方案2:CTE暂存结果(兼容旧版不支持窗口函数的数据库)
如果你的数据库版本不支持窗口函数,可以用CTE复用原查询结果:
WITH base AS ( select descr, sum(percentage) as perc from ( COMPLEX QUERY HERE) as A group by descr ) SELECT descr, perc, (SELECT SUM(perc) FROM base) as `sum` FROM base ORDER BY perc desc
原理:CTE内的原查询只会执行一次,后续计算总和、返回明细都是复用暂存的结果,不会触发内层复杂查询的重复执行。
内容的提问来源于stack exchange,提问作者sharkyenergy
相关产品推荐
相关产品推荐

