2015-06-19 46 views
-1

如何使用oracle SQL分層查詢爲每個員工打印整個員工層次結構。員工SQL的完整主管層次結構Oracle

樣品EMPLOYEE表>>

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

還沒有一個數據庫來測試這個,但認爲你需要使用SYS_CONNECT_BY_PATHCONNECT BY PRIOR。嘗試是這樣的:

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

您還應該添加一個以''開始'empid = mgr'開始並且* connect by *子句更改爲'CONNECT BY PRIOR EmpID = MGR和empId!= mgr'。儘管如此,結果並不是OP想要的,但它很接近。 –

+0

非常感謝Joe的回覆。不知何故,它不像預期的那樣工作。 –

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); 

SELECT語句的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; 

注意,我的mgrempId=1設置爲null因爲從技術上講,一個人是不是他自己的經理。層級中最頂層的人沒有經理,因此在技術上相應地設置經理更爲正確。這也將使相關聲明更容易。

+0

謝謝Rene,對於建議,Lemme試着讓你知道 –