对Correlated Subquery(相关子查询)循环逻辑的疑问
相关子查询的执行逻辑:不存在循环依赖
你觉得是循环逻辑,核心是误解了相关子查询的执行顺序——它不是先计算外层的薪资再关联department_id,而是逐行处理外层数据,每一行的department_id先被传入子查询,子查询用这个确定的department_id算出薪资结果,再回到外层做条件判断。
拿一个典型的相关子查询例子来说明:
-- 查询每个部门中薪资高于本部门平均薪资的员工 SELECT employee_id, department_id, salary FROM employees e WHERE salary > ( SELECT AVG(salary) FROM employees WHERE department_id = e.department_id );
它的执行步骤是:
- 外层查询从
employees表中取出第一行数据,获取该行的department_id(比如值为10) - 将这个确定的
department_id=10传入子查询,子查询计算出部门10的平均薪资(比如5000) - 对比当前外层行的
salary是否大于5000,满足则保留该行 - 外层继续取下一行数据,重复上述流程:用该行的department_id触发子查询计算,再做薪资判断
简单来说,外层的department_id是“先有”的固定值,子查询基于这个值算出薪资相关的结果,再回到外层做条件校验,完全不存在循环依赖的问题。
内容的提问来源于stack exchange,提问作者Joseph Erickson
相关产品推荐
相关产品推荐

