请求解释自关联Correlated Query:同表内外查询的对比逻辑
同表相关子查询的对比逻辑解析
核心逻辑
相关子查询的关键在于内查询会直接引用外查询的字段,在同表场景下,我们通过给表设置不同别名(比如示例里的e和m),把同一张表拆成两个逻辑上独立的表来使用:外查询逐行遍历表中记录,内查询则针对当前遍历到的这条记录,去表中匹配对应的关联数据,完成条件对比。
拆解你的SQL语句
先看完整SQL代码:
SELECT e.name AS Employee FROM Employee e WHERE e.salary > ( SELECT m.salary FROM Employee m WHERE m.id = e.managerId );
步骤1:外查询遍历员工数据
外查询用别名e指代Employee表,会逐行取出每一条员工的完整数据(包含name、salary、managerId等字段)。
步骤2:内查询匹配对应经理的薪资
对于外查询当前取出的这条员工记录,内查询用别名m再次调用Employee表,通过m.id = e.managerId这个条件,精准定位到该员工直属经理的记录,然后提取经理的薪资m.salary。
步骤3:对比筛选符合条件的员工
外查询将当前员工的薪资e.salary和内查询返回的经理薪资做比较,如果员工薪资更高,就把该员工的姓名e.name加入最终结果集。
直观示例说明
假设Employee表有以下数据:
| id | name | salary | managerId |
|---|---|---|---|
| 1 | 老王 | 8000 | NULL |
| 2 | 张三 | 9000 | 1 |
| 3 | 李四 | 7000 | 1 |
- 外查询遍历到张三(id=2)时,
e.managerId为1,内查询找到id=1的老王,取出薪资8000。9000>8000,因此张三会被纳入结果。 - 外查询遍历到李四(id=3)时,
e.managerId为1,内查询取出老王的8000,7000<8000,因此李四不会被选中。 - 老王的
managerId为NULL,内查询找不到对应记录,因此不会被纳入结果。
最终输出结果:
| Employee |
|---|
| 张三 |
内容的提问来源于stack exchange,提问作者Whistler marc Vicky
相关产品推荐
相关产品推荐

