如何在 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