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

Oracle层级查询:能否在connect by时添加分组标识列?

在Oracle层级查询中直接添加起始员工分组标识

我正在练习Oracle的SQL层级查询,使用的员工表定义如下:

With 
EmpTable as (
      Select 7839 EMPNO,'KING' ENAME,null MGR from dual union all
      Select 7369 EMPNO,'SMITH' ENAME,7902 MGR from dual union all
      Select 7499 EMPNO,'ALLEN' ENAME,7698 MGR from dual union all
      Select 7521 EMPNO,'WARD' ENAME,7698 MGR from dual union all
      Select 7566 EMPNO,'JONES' ENAME,7839 MGR from dual union all
      Select 7654 EMPNO,'MARTIN' ENAME,7698 MGR from dual union all
      Select 7698 EMPNO,'BLAKE' ENAME,7839 MGR from dual union all
      Select 7782 EMPNO,'CLARK' ENAME,7839 MGR from dual union all
      Select 7788 EMPNO,'SCOTT' ENAME,7566 MGR from dual union all
      Select 7844 EMPNO,'TURNER' ENAME,7698 MGR from dual union all
      Select 7876 EMPNO,'ADAMS' ENAME,7788 MGR from dual union all
      Select 7900 EMPNO,'JAMES' ENAME,7698 MGR from dual union all
      Select 7902 EMPNO,'FORD' ENAME,7566 MGR from dual union all
      Select 7934 EMPNO,'MILLER' ENAME,7782 MGR from dual)

我原本使用CONNECT BY子句查询指定员工的上级层级,代码如下:

Select E.*,LEVEL from EmpTable E
start with E.ENAME in ('FORD','ADAMS')     -- 初始条件
connect by Prior E.MGR= EMPNO           
order siblings by EMPNO;

现在需要添加一个GrpName列,用来标识每行记录属于哪个起始员工(即START WITH中指定的FORD或ADAMS),目前通过辅助列和辅助表实现了需求,但方法繁琐,想知道能否在层级查询过程中直接添加该分组标识。


可以使用Oracle提供的CONNECT_BY_ROOT函数直接实现这个需求,该函数会返回当前层级路径的根节点(也就是START WITH指定的起始员工)的指定列值。

修改后的查询代码如下:

Select 
    E.*,
    LEVEL,
    CONNECT_BY_ROOT E.ENAME AS GrpName  -- 获取根节点的ENAME作为分组标识
from EmpTable E
start with E.ENAME in ('FORD','ADAMS')
connect by Prior E.MGR= EMPNO           
order siblings by EMPNO;

说明

  • CONNECT_BY_ROOT E.ENAME会返回当前行所在层级路径的最顶层节点(起始员工)的ENAME值,正好作为每条记录的分组标识GrpName。
  • 这个方法不需要额外的辅助表或复杂逻辑,直接在层级查询中完成分组标识的添加,结果完全符合需求。

内容的提问来源于stack exchange,提问作者jou yungcheng

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:31:06