【问题标题】:Get all employee who directly or indirectly reports to an employee, with hierarchy level no获取直接或间接向员工报告的所有员工,层级为 no
【发布时间】:2013-04-20 09:23:00
【问题描述】:

我有一个像这样的员工表

emp_id bigint,
reports_to bigint,
emp_name varchar(20),
Constraint [PK_Emp] Primary key (emp_id),
Constraint [FK_Emp] Foreign key (reports_to) references [MSS].[dbo].[Emp]([emp_id])

emp_id         reports_to        emp_name
------         ------       --------------
1              null         Sumanta
2              1            Arpita
3              null         Pradip
4              1            Sujon
5              2            Arpan
6              5            Jayanti

我想获取所有直接或间接向 Sumanta 或 emp_id(1) 报告的员工,并且具有层级,如下所示:

emp_id         hierarchy_level         emp_name
------         ---------------        ----------
2                    1                  Arpita
4                    1                  Sujon
5                    2                  Arpan
6                    3                 Jayanti

我是 SQL 新手,只是找不到使用什么或如何获得这些结果。是否值得一个带有表值变量的存储过程,或者只是一个 Tsql 选择查询就足够了。欢迎任何帮助。

我所做的只是-

Select Ep.emp_id,ep.emp_eame 
From Emp as E 
Inner Join Emp as Ep on Ep.reports_to=E.Emp_id 
Where E.reports_to=1 or E.emp_id=1;

但这准确到 2 级,我什至无法生成 hierarchy_level 编号。 任何建议,想法............将是最有帮助的............

【问题讨论】:

    标签: sql sql-server foreign-keys iteration primary-key


    【解决方案1】:

    您可以使用递归 CTE:

    ; with  CTE as 
            (
            select  emp_id
            ,       reports_to
            ,       emp_name
            ,       1 as level
            from    Emp
            where   emp_name = 'Sumanta'
            union all
            select  child.emp_id
            ,       child.reports_to
            ,       child.emp_name
            ,       level + 1
            from    Emp child
            join    CTE parent
            on      child.reports_to = parent.emp_id
            )
    select  *
    from    CTE
    

    Example at SQL Fiddle.

    【讨论】:

    • 'With CTE as ( Select emp_id,emp_Name,reports_to,1 as Level From emp Where reports_to=1 Union all Select E.emp_id,E.emp_name,E.reports_to,Level+1 From emp as E Inner join CTE on E.reports_to=CTE.emp_id ) Select * from CTE;'刚刚找到了我正在寻找的东西...... @Andomar 谢谢
    • 哇,我不知道 SqlFiddle
    • @Andomar,尝试关注您个人资料中的“斯坦福 SQL 课程”链接,但它似乎已损坏。并且downforeveryoneorjustme.com 确认了这一点
    • @ГеннадийВанинНовосибирск: online.stanford.edu/db-win13 似乎是当前链接:)
    【解决方案2】:

    使用 Common_Table_Expression 我们可以这样写

    WITH Employee_CTE(employeeid,hierarchy_level,name) AS  
    (  
       SELECT employeeid,1 as level,name from employee where employeeid=1 
       UNION ALL  
       SELECT e.employeeid,level +1, e.name 
       from employee e   
       INNER JOIN Employee_CTE c ON e.employeeid = c.managerid  
    )  
    SELECT * FROM Employee_CTE order by employeeid  
    

    【讨论】:

      猜你喜欢
      • 2019-04-23
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      相关资源
      最近更新 更多