【问题标题】:How to get the employees and their levels reporting to the manager directly and indirectly without using a CTE in SQL Server?如何在不使用 SQL Server 中的 CTE 的情况下让员工及其级别直接和间接地向经理报告?
【发布时间】:2015-03-18 18:20:14
【问题描述】:
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级……以此类推,间接汇报给经理的下属员工(也是其他员工的经理)

【问题讨论】:

  • 有固定的最大关卡数吗?
  • 不,先生,它必须是动态变量。
  • 为什么在两个平台上都需要完全相同的查询?我们有诸如存储过程之类的东西,因此每个平台都可以针对该平台以最佳方式解决查询问题,而应用程序不必关心。
  • 我建议你阅读How to write good questions
  • 任何建议,想法............将是最有帮助的............

标签: sql sql-server sql-server-2008 sql-server-2012 sql-server-2014


【解决方案1】:

迭代。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-23
    • 2013-04-20
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多