SQL 来自员工 Manager/Supervisor/Employee 层次结构的报告 Table
SQL Reports for Manager/Supervisor/Employee Hierarchy from an Employee Table
我有一个员工 table,它显示员工 ID 和他们的经理 ID。经理们想要的报告不仅要显示他的直接下属,还要显示他本人和向他的直接下属报告的所有员工。
例如,我的 table 将具有以下 table:
我需要为经理 1 编写的报告将包含他的信息以及他的直接下属(主管 1 和主管 2)及其下属(员工 1 到员工 4)。
是否有某种我可以使用的连接或任何其他代码将此 table 多次关联回自身以获取间接报告?
一个recursive Common Table Expression就是你要找的:
declare @Employees table (EmpID nvarchar(15), MgrID nvarchar(15));
insert into @Employees values ('Manager1', null);
insert into @Employees values ('Supervisor1', 'Manager1');
insert into @Employees values ('Employee1', 'Supervisor1');
insert into @Employees values ('Employee2', 'Supervisor1');
insert into @Employees values ('Supervisor2', 'Manager1');
insert into @Employees values ('Employee3', 'Supervisor2');
insert into @Employees values ('Employee4', 'Supervisor2');
with Employees (MgrID, EmpID, [Rank], [Reports]) as
(
select
MgrID
, EmpID
, 0 'Rank'
, cast(EmpID as nvarchar(max)) 'Reports'
from @Employees
where MgrID is null
union all
select
e.MgrID
, e.EmpID
, [Rank] + 1
, [Reports] + '; ' + e.EmpID
from @Employees e
inner join Employees on Employees.EmpID = e.MgrID
)
select *
from Employees
where Reports like 'Manager1%'
order by [Rank];
我有一个员工 table,它显示员工 ID 和他们的经理 ID。经理们想要的报告不仅要显示他的直接下属,还要显示他本人和向他的直接下属报告的所有员工。
例如,我的 table 将具有以下 table:
我需要为经理 1 编写的报告将包含他的信息以及他的直接下属(主管 1 和主管 2)及其下属(员工 1 到员工 4)。
是否有某种我可以使用的连接或任何其他代码将此 table 多次关联回自身以获取间接报告?
一个recursive Common Table Expression就是你要找的:
declare @Employees table (EmpID nvarchar(15), MgrID nvarchar(15));
insert into @Employees values ('Manager1', null);
insert into @Employees values ('Supervisor1', 'Manager1');
insert into @Employees values ('Employee1', 'Supervisor1');
insert into @Employees values ('Employee2', 'Supervisor1');
insert into @Employees values ('Supervisor2', 'Manager1');
insert into @Employees values ('Employee3', 'Supervisor2');
insert into @Employees values ('Employee4', 'Supervisor2');
with Employees (MgrID, EmpID, [Rank], [Reports]) as
(
select
MgrID
, EmpID
, 0 'Rank'
, cast(EmpID as nvarchar(max)) 'Reports'
from @Employees
where MgrID is null
union all
select
e.MgrID
, e.EmpID
, [Rank] + 1
, [Reports] + '; ' + e.EmpID
from @Employees e
inner join Employees on Employees.EmpID = e.MgrID
)
select *
from Employees
where Reports like 'Manager1%'
order by [Rank];