我有一個下面描述的情形我需要一個主管下的所有僱員
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
我有一個下面描述的情形我需要一個主管下的所有僱員
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
你需要使用遞歸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
請看看這個問題也,它同樣喜歡你的問題。 Sql server CTE and recursion example
沒有人期望西班牙宗教裁判所一個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
的優點是,我看到的是,你不計算每次你需要回答這種類型的問題時,都可以隨時隨地進行層級分析。你做了一次,你就完成了。
您需要遞歸CTE – AK47 2014-09-25 04:58:43
「EmpID Name SupervisorID 1 A 9 2 B 8 3 C 1 4 D 3」是什麼意思?你想要什麼??? – 2014-09-25 04:58:50