[英]Recursive SQL self join
我有以下雇员表,并且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
我也知道我可以向上述查询添加更多的左联接,以获得所需的输出。 但是对层次结构的深度没有限制,因此我想它将需要动态完成。
任何帮助将不胜感激
您需要递归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
);
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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.