You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表有以下测试数据:

empnoenamemgr
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:36:49