Oracle两个EMP表关联查询的差异与执行逻辑咨询
两个Oracle查询的差异与执行逻辑
嘿,这两个查询本质上是把「员工-经理」的关联方向完全反过来了,咱们拆解开慢慢看:
核心逻辑差异
先明确emp表的字段含义:empno是员工的唯一工号,mgr字段存的是该员工直属经理的empno(也就是经理的工号)。
1. 第一个查询:SELECT e.ename, m.ename FROM emp e, emp m WHERE e.empno = m.mgr;
这里的关联条件e.empno = m.mgr翻译成人话是:m这个员工的经理工号等于e的员工工号——换句话说,e是经理,m是e的下属员工。所以查询结果的第一列是经理的名字,第二列是该经理下属员工的名字。
2. 第二个查询:SELECT e.ename, m.ename FROM emp e, emp m WHERE m.empno = e.mgr;
关联条件m.empno = e.mgr则是:e这个员工的经理工号等于m的员工工号——也就是e是员工,m是e的直属经理。所以结果的第一列是员工的名字,第二列是该员工的经理名字。
实际例子对比
假设emp表有以下测试数据:
| empno | ename | mgr |
|---|---|---|
| 1001 | 老王 | null |
| 1002 | 小李 | 1001 |
| 1003 | 小张 | 1001 |
第一个查询的结果:
ename | ename ------|------ 老王 | 小李 老王 | 小张(展示的是每个经理对应的下属列表)
第二个查询的结果:
ename | ename ------|------ 小李 | 老王 小张 | 老王(展示的是每个员工对应的直属经理)
Oracle的执行逻辑
Oracle处理这两个查询时,逻辑上都是先通过别名e和m把同一张emp表当成两个独立的虚拟表,先做笛卡尔积,再过滤符合关联条件的行(实际优化器会根据数据量选择嵌套循环、哈希连接等更高效的执行方式,但逻辑是等价的):
- 对于第一个查询:遍历每一条
m(员工记录),在e(经理候选)中找到empno等于m.mgr的行,最终拼接经理和下属的名字。 - 对于第二个查询:遍历每一条
e(员工记录),在m(经理候选)中找到empno等于e.mgr的行,最终拼接员工和经理的名字。
说白了就是,别名和关联条件的方向,决定了我们把同一张表的行当成「经理」还是「员工」来匹配。
内容的提问来源于stack exchange,提问作者alpha bita
相关产品推荐
相关产品推荐

