员工SQL Oracle的完整Supervisor层次结构

时间:2015-06-19 02:47:24

标签: sql oracle

我们如何使用oracle SQL层次结构查询为每个员工打印整个员工层次结构。

示例员工表>>

EmpID, ENAME, MGR
1,     A,     1
2,     B,     1
3,     C,     2
4,     C,     2
5,     C,     3

样本输出>>

EmpID, ENAME, Hierarchy
1,     A,     -
2,     B,     /1
3,     C,     /1/2
4,     C,     /1/2
5,     C,     /1/2/3

有人能帮助我吗?提前谢谢。

2 个答案:

答案 0 :(得分:2)

没有数据库可以对此进行测试,但您认为需要使用SYS_CONNECT_BY_PATHCONNECT BY PRIOR。尝试类似:

SELECT EmpID, ENAME, SYS_CONNECT_BY_PATH(MGR, '/') "Heirarchy"
FROM Employee
CONNECT BY PRIOR EmpID= MGR;

答案 1 :(得分:0)

使用公用表表达式(CTE):

测试数据

create table tq84_sample_employee (
  empid  number  primary key,
  ename  varchar2(10),
  mgr    number references tq84_sample_employee
);

insert into tq84_sample_employee values(1, 'A', 1);
insert into tq84_sample_employee values(2, 'B', 1);
insert into tq84_sample_employee values(3, 'C', 2);
insert into tq84_sample_employee values(4, 'C', 2);
insert into tq84_sample_employee values(5, 'C', 3);

选择带有CTE的声明

with e(empId, ename, hierarchy) as (
  select
    t.empId,
    t.ename,
    null
  from
    tq84_sample_employee t
  where
    empId = mgr
                     UNION ALL
  select
    t.empId,
    t.ename,
    e.hierarchy || '/' || e.empId
  from
    tq84_sample_employee t join
    e                    e on t.mgr = e.empId
  where
    t.empId != t.mgr
)
select 
  empId,
  ename,
  nvl(hierarchy, '-') hierarchy
from e;

清理

drop table tq84_sample_employee;

注意,我已将mgr的{​​{1}}设置为empId=1,因为从技术上讲,有人不是他自己的经理。层次结构中最顶层的人没有经理,因此在技术上更正确地设置经理。这也将使相关陈述更容易。