You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用自连接计算Running sum的查询执行逻辑疑问

理解基于相关子查询的累计求和SQL执行逻辑

问题描述

我一直试图理解这段计算累计求和(Running sum)的SQL查询执行逻辑。我尝试可视化执行过程,但认为它应该是从下往上执行而非从上往下——即先显示所有薪资的总和,再随ID递增而递减。请问我的理解是否有误?或是遗漏了相关概念?

数据表:emp_details

idnamesalary
1Shripadh10000
2Satya1400
3Jia500
4David1800
5Michael3000
6Arvind2400
7Asha4200
8Maryam3500
9Reshma2000
10Akshay2500

待分析的SQL查询

SELECT *,
  (
    SELECT SUM(T2.[SALARY])  
    FROM emp_details AS T2
    WHERE T2.[ID] <= T1.[ID]
  ) AS [Running Total]
FROM emp_details AS T1

执行逻辑解释

你的理解是错误的,这个查询的执行顺序是从上到下(按ID递增顺序)逐步计算累计值,最终结果随ID递增而累加,而非递减。具体执行过程如下:

  1. 外层查询FROM emp_details AS T1会逐行取出表中的每条记录,作为当前处理的基准行。
  2. 对于每一条T1的记录,内层子查询会执行:从表中找出所有T2.ID <= 当前T1.ID的记录,对这些记录的salary求和,得到当前行的累计值。
  3. 举几个具体例子:
    • 当T1的ID=1时,子查询只取ID<=1的记录(仅ID=1),累计和为10000。
    • 当T1的ID=2时,子查询取ID<=2的记录(ID=1和2),累计和为10000+1400=11400。
    • 当T1的ID=10时,子查询取所有ID<=10的记录,累计和为所有薪资的总和(10000+1400+500+1800+3000+2400+4200+3500+2000+2500=31300)。

这个查询本质是相关子查询(并非严格意义上的自连接,而是通过关联T1和T2的ID实现累计),核心逻辑是用当前行的ID作为筛选条件,汇总所有小于等于该ID的薪资,所以结果必然随ID递增而逐步累加。

内容的提问来源于stack exchange,提问作者Manish Amin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 13:32:42