如何在Oracle中使用SELECT语句计算20到30之间数字的总和
Oracle数据库实现20-30区间数字求和的SQL方案
以下所有写法默认统计区间包含20和30两个边界值,最终计算结果均为275,可直接在Oracle环境执行。
方案1:等差数列公式直接计算(性能最优)
连续整数属于公差为1的等差数列,直接套用求和公式不需要遍历生成序列,不管区间跨度多大都能毫秒级返回结果,最适合大区间计算场景:
SELECT (20 + 30) * (30 - 20 + 1) / 2 AS sum_result FROM dual;
注意:闭区间统计(同时包含首尾两个数字)时项数必须是
末项-首项+1,漏写+1会少算一个边界值导致结果错误。
方案2:CONNECT BY层级查询生成序列求和(Oracle原生特性)
通过Oracle专属的层级语法生成20到30的连续数字序列,再调用SUM聚合函数求和,逻辑直观易修改,适合需要对生成的序列做额外过滤、加工的场景:
-- 简写版本 SELECT SUM(level + 19) AS sum_result FROM dual CONNECT BY level <= 30 - 20 + 1;
-- 可读性更好的嵌套版本 SELECT SUM(num) AS sum_result FROM ( SELECT 20 + (LEVEL - 1) AS num FROM dual CONNECT BY LEVEL <= 30 - 20 + 1 );
方案3:递归CTE写法(兼容通用SQL标准)
Oracle 11gR2及以上版本支持递归公用表表达式(CTE),写法符合ANSI SQL规范,如果后续需要迁移到其他支持递归CTE的数据库,修改成本极低:
WITH num_seq(n) AS ( -- 锚点成员:定义区间起始值 SELECT 20 AS n FROM dual UNION ALL -- 递归成员:每次+1直到达到区间结束值 SELECT n + 1 FROM num_seq WHERE n < 30 ) SELECT SUM(n) AS sum_result FROM num_seq;
使用说明
- 上述所有写法默认统计闭区间结果,返回值均为275,和手动累加结果一致
- 如果需要调整为开区间(比如不包含20、不包含30),只需要修改对应起始值、结束判断条件即可
内容的提问来源于stack exchange,提问作者shajin
相关产品推荐
相关产品推荐

