Oracle中使用子查询更新列的内部执行原理咨询
解析这条UPDATE语句的执行逻辑与子查询返回结果
咱们来一步步拆解这条UPDATE语句的执行逻辑,搞清楚它是怎么把部门员工数更新到DEPARTMENT表的:
1. 整体执行模式:逐行关联更新
这条语句属于关联更新,核心是把DEPARTMENT表的每一行,和EMPLOYEE表中对应部门的记录关联起来,用统计结果更新COUNTS字段。具体执行步骤如下:
- 数据库会遍历DEPARTMENT表中的每一条记录(也就是每一个部门),每次只处理一行。
- 针对当前正在处理的部门行(我们用别名
p指代这一行),执行后面的子查询,拿到该部门的员工数量。 - 把这个数量直接赋值给当前行的
COUNTS字段,完成该行的更新。
2. 子查询的具体执行逻辑
子查询select count(*) from EMPLOYEE e where p.dept_id = e.dept_id是一个标量子查询——它每次执行只会返回一个单一的数值,而不是多行结果:
- 子查询里的
p.dept_id是当前正在处理的DEPARTMENT表行的DEPT_ID值(比如第一次处理时是1,第二次是2,第三次是3)。 - 它会在EMPLOYEE表中筛选出
DEPT_ID和当前部门匹配的所有记录,然后用count(*)统计这些记录的总数。 - 举个具体例子:
- 当处理DEPARTMENT表中
DEPT_ID=1的行时,子查询会统计EMPLOYEE里DEPT_ID=1的记录(也就是EMP_ID=101和104),返回结果2。 - 当处理
DEPT_ID=2的行时,子查询统计到EMPLOYEE里只有EMP_ID=102这一条匹配记录,返回1。 - 处理
DEPT_ID=3的行时,子查询统计到EMP_ID=103这一条,返回1。
- 当处理DEPARTMENT表中
3. 最终更新效果
每一行DEPARTMENT记录的COUNTS字段都会被对应的子查询结果覆盖,最终就得到了你想要的DEPARTMENT表状态:
DEPT_ID COUNTS 1 2 2 1 3 1
内容的提问来源于stack exchange,提问作者Neha
相关产品推荐
相关产品推荐

