解析Employee表上两个自INNER JOIN SQL查询的差异
自内连接查询的差异解析
员工表(Employee table)
| id | name | salary | managerId |
|---|---|---|---|
| 1 | Joe | 70000 | 3 |
| 2 | Henry | 80000 | 4 |
| 3 | Sam | 60000 | Null |
| 4 | Max | 90000 | Null |
以下两个针对Employee表的自INNER JOIN查询有什么差异?
第一个查询
SELECT E.name as Employee FROM Employee as E INNER JOIN Employee as E2 ON E.id = E2.managerId
该查询返回:Sam、Max
第二个查询
SELECT E.name as Employee FROM Employee as E INNER JOIN Employee as E2 ON E.managerId = E2.id
该查询返回:Joe、Henry
核心差异说明
这两个查询的本质区别是自连接的关联条件方向完全相反,对应查询的角色定位不同:
- 第一个查询中,
E代表管理者,E2代表下属员工。关联条件E.id = E2.managerId是在筛选「存在下属的管理者」——也就是找那些id出现在其他员工managerId字段里的人,所以返回Sam和Max。 - 第二个查询中,
E代表普通员工,E2代表他们的管理者。关联条件E.managerId = E2.id是在筛选「有上级管理者的员工」——也就是找那些managerId不为空且对应存在管理者记录的人,所以返回Joe和Henry。
内容的提问来源于stack exchange,提问作者Sourabh Sharma
相关产品推荐
相关产品推荐

