我有以下员工表,EmpID
和ManagerID
之间存在外键关系。
员工表
所需输出
我希望能够按层次结构顺序显示员工姓名,从最高管理者到最低级别的>
分隔,其中EmpID是层次结构底部员工的ID。
我知道我可以通过使用以下SQL将表连接到自身来获得所需的输出。
select e1.empID, e1.DeptID, e2.Name + ' > ' + e1.Name as Description
from employee e1
left join employee e2
on e1.managerId = e2.empId
我也知道我可以在上面的查询中添加更多左连接以获得所需的输出。但是层次结构的深度没有限制,所以我想它需要动态完成。
非常感谢任何帮助
答案 0 :(得分:3)
你想要一个递归的CTE:
with e as (
select cast(name as varchar(max)) as list, empId, 0 as level
from employees
where managerID is null
union all
select e.list + '>' + e2.name, e2.empId, level + 1
from e join
employees e2
on e.empId = e2.managerId
)
select e.*
from e
where not exists (select 1
from employees e2
where e2.managerId = e.empId
);
答案 1 :(得分:0)
declare @Employees table (
EmpId int ,
DeptId int ,
Name varchar(30) ,
ManagerId int
);
insert into @Employees values
( 1, 1, 'Zippy' , 2 ),
( 2, 1, 'George' , 3 ),
( 3, 1, 'Bungle' , 4 ),
( 4, 1, 'Geoffrey' , null ),
( 5, 2, 'Rod' , 6 ),
( 6, 2, 'Jane' , 7 ),
( 7, 2, 'Freddy' , null );
with cte as
(
select
EmpId ,
DeptId ,
ManagerId ,
Path = cast('' as varchar(4000)),
Name ,
Level = 0
from
@Employees
where
ManagerId is null
union all
select
EmpId = e.EmpId,
DeptId = e.DeptId,
ParentId = e.ManagerId,
Path = cast(concat(cte.Path, cte.Name, ' › ') as varchar(4000)),
Name = e.Name,
Level = cte.Level + 1
from
@Employees e
inner join cte on cte.EmpId = e.ManagerId
)
select
EmpId ,
DeptId ,
ManagerId ,
Path ,
Name ,
FullPath = Path + Name,
Level
from
cte
order by
FullPath;