使用自连接计算Running sum的查询执行逻辑疑问
理解基于相关子查询的累计求和SQL执行逻辑
问题描述
我一直试图理解这段计算累计求和(Running sum)的SQL查询执行逻辑。我尝试可视化执行过程,但认为它应该是从下往上执行而非从上往下——即先显示所有薪资的总和,再随ID递增而递减。请问我的理解是否有误?或是遗漏了相关概念?
数据表:emp_details
| id | name | salary |
|---|---|---|
| 1 | Shripadh | 10000 |
| 2 | Satya | 1400 |
| 3 | Jia | 500 |
| 4 | David | 1800 |
| 5 | Michael | 3000 |
| 6 | Arvind | 2400 |
| 7 | Asha | 4200 |
| 8 | Maryam | 3500 |
| 9 | Reshma | 2000 |
| 10 | Akshay | 2500 |
待分析的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递增而累加,而非递减。具体执行过程如下:
- 外层查询
FROM emp_details AS T1会逐行取出表中的每条记录,作为当前处理的基准行。 - 对于每一条T1的记录,内层子查询会执行:从表中找出所有
T2.ID <= 当前T1.ID的记录,对这些记录的salary求和,得到当前行的累计值。 - 举几个具体例子:
- 当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
相关产品推荐
相关产品推荐

