2014-09-25 50 views
0

我有一個下面描述的情形我需要一個主管下的所有僱員

EmpID  Name  SupervisorID 
1   A   9 
2   B   8 
3   C   1 
4   D   3 

我需要下監ID 1

這裏EmployeeID爲3的所有僱員正在1我需要4是也下3

以下輸出是必需的。

EmpID Name SupervisorID 
3  C  1 
4  D  3 
+0

您需要遞歸CTE – AK47 2014-09-25 04:58:43

+0

「EmpID Name SupervisorID 1 A 9 2 B 8 3 C 1 4 D 3」是什麼意思?你想要什麼??? – 2014-09-25 04:58:50

回答

2

你需要使用遞歸CTE爲this.Try此,

With CTE as 
(
select EmpID,Name,SupervisorID from Emp 
where SupervisorID =1 
Union All 

select a.EmpID,a.Name,a.SupervisorID from Emp as a 
    inner join CTE b on a.SupervisorID= b.EmpID 

) 

select * from CTE 

Fiddle Demo Here

請看看這個問題也,它同樣喜歡你的問題。 Sql server CTE and recursion example

0

沒有人期望西班牙宗教裁判所一個HierarchyId。現在,無論何時我看到一個組織結構(就像這裏的組織結構),我都會獲得HierarchyId數據類型。從本質上講,它可以讓你回答這樣的問題,比如「在這個下面的哪個值?」。和「這個人屬於哪個價值?」。以下是我想實現它:

alter table dbo.Employee add OrgStructure HierarchyId null; 

with h as (
    select EmployeeId, SupervisorId, '/' + cast(EmployeeId as varchar) + '/' as h 
    from dbo.Employee as e 
    where e.SupervisorId is null --employees w/o a supervisor 

    union all 

    select e.EmployeeId, e.SupervisorId, h.h + '/' + cast(EmployeeId as varchar) + '/' 
    from dbo.Employee as e 
    join h 
     on e.SupervisorId = h.SupervisorId 
) 
update e 
set OrgStructure = h.h 
from dbo.Employee as e 
join h 
    on e.EmployeeId = h.EmployeeId; 

create index [IX_Employee_OrgStructure] on dbo.Employee (OrgStructure) 

現在繁重的完成,實際上回答你的問題很簡單:

select * 
from dbo.Employee as supervisor 
join dbo.Employee as reports 
    on reports.OrgStructure.IsDescendantOf(supervisor.OrgStructure) 
where supervisor.EmployeeId = 1 

的優點是,我看到的是,你不計算每次你需要回答這種類型的問題時,都可以隨時隨地進行層級分析。你做了一次,你就完成了。

相關問題