如何在 SQL 服务器中不使用 CTE 直接或间接地让员工及其级别向经理报告?
How to get the employees and their levels reporting to the manager directly and indirectly without using a CTE in SQL Server?
employee_id manager_id
1 1
2 1
3 1
4 2
5 1
6 3
7 2
8 2
9 3
10 2
如何在不使用 CTE 的情况下获得 emanager
的下属及其级别?
因为我们必须在 MySQL 中执行相同的操作。
输出应该是这样的
@Managerid = 1
manager_id employee_id Level
1 2 1
1 3 1
1 5 1
2 4 2
2 7 2
2 8 2
2 10 2
3 9 3
级别 1 直接向相关经理报告; 2 级和 3 级...等等是向经理的报告员工(也是其他员工的经理)的间接报告
迭代。
create table #employee (
EmployeeID int,
ManagerID int
)
insert #employee
values
(1, 1),
(2, 1),
(3, 1 ),
(4, 2 ),
(5, 1 ),
(6, 3),
(7, 2 ),
(8, 2 ),
(9, 3 ),
(10, 2)
declare @RootEmployeeID int = 1
declare @lev int = 0
declare @rowcount int = 0
declare @oldcount int = 0
create table #employeetree (
EmployeeID int,
ManagerID int,
lev int
)
insert #employeetree
(EmployeeID, ManagerID, lev)
select EmployeeID,
ManagerID,
0
from #employee
where
EmployeeID = @RootEmployeeID
select @rowcount = COUNT(*) from #employeetree
while @rowcount > @oldcount
begin
insert #employeetree
(EmployeeID, ManagerID, lev)
select e.EmployeeID,
e.ManagerID,
et.lev + 1
from #employeetree et
join #employee e on
e.ManagerID = et.EmployeeID
and e.ManagerID <> e.EmployeeID -- skip cases where you are your own manager (otherwise you go infinite loop)
where
et.lev = @lev
-- This works for both, instead of using @@ROWCOUNT (SQL Server) or ROW_COUNT() (MySql):
set @lev = @lev + 1
set @oldcount = @rowcount
select @rowcount = COUNT(*) from #employeetree
end
select * from #employeetree
drop table #employeetree
drop table #employee
employee_id manager_id
1 1
2 1
3 1
4 2
5 1
6 3
7 2
8 2
9 3
10 2
如何在不使用 CTE 的情况下获得 emanager
的下属及其级别?
因为我们必须在 MySQL 中执行相同的操作。
输出应该是这样的
@Managerid = 1
manager_id employee_id Level
1 2 1
1 3 1
1 5 1
2 4 2
2 7 2
2 8 2
2 10 2
3 9 3
级别 1 直接向相关经理报告; 2 级和 3 级...等等是向经理的报告员工(也是其他员工的经理)的间接报告
迭代。
create table #employee (
EmployeeID int,
ManagerID int
)
insert #employee
values
(1, 1),
(2, 1),
(3, 1 ),
(4, 2 ),
(5, 1 ),
(6, 3),
(7, 2 ),
(8, 2 ),
(9, 3 ),
(10, 2)
declare @RootEmployeeID int = 1
declare @lev int = 0
declare @rowcount int = 0
declare @oldcount int = 0
create table #employeetree (
EmployeeID int,
ManagerID int,
lev int
)
insert #employeetree
(EmployeeID, ManagerID, lev)
select EmployeeID,
ManagerID,
0
from #employee
where
EmployeeID = @RootEmployeeID
select @rowcount = COUNT(*) from #employeetree
while @rowcount > @oldcount
begin
insert #employeetree
(EmployeeID, ManagerID, lev)
select e.EmployeeID,
e.ManagerID,
et.lev + 1
from #employeetree et
join #employee e on
e.ManagerID = et.EmployeeID
and e.ManagerID <> e.EmployeeID -- skip cases where you are your own manager (otherwise you go infinite loop)
where
et.lev = @lev
-- This works for both, instead of using @@ROWCOUNT (SQL Server) or ROW_COUNT() (MySql):
set @lev = @lev + 1
set @oldcount = @rowcount
select @rowcount = COUNT(*) from #employeetree
end
select * from #employeetree
drop table #employeetree
drop table #employee