【问题标题】:SQL CTE Recursion: Returning Parent RecordsSQL CTE 递归:返回父记录
【发布时间】:2011-03-03 22:54:48
【问题描述】:

我目前正在运行 CTE 查询,以递归方式从员工表构建员工层次结构,类似于大多数递归示例所展示的。我卡住的地方是我试图查询单个员工并检索他之上的层次结构。下面是我尝试使用的表的示例:

Employees
===========================================================================
EmployeeID    MgrID    Name
1             null     Joe
2             1        John
3             2        Rob
4             2        Eric

以下是允许我从上到下显示层次结构的 SQL:

with employeeMaster as (
    select p.EmployeeID, p.MgrID, p.Name
    from Employees p
    where p.MgrID is null

    union all

    select c.EmployeeID, c.MgrID, c.Name
    from employeeMaster cte inner join Employees c on c.MgrID = cte.EmployeeID
)
select * from employeeMaster

我卡住的地方是我不知道如何查询最低级别的员工,无论是 Rob 还是 Eric,并从 Joe > John > Eric 返回他上方的层次结构。似乎这应该很容易,但我无法终生发现它。

【问题讨论】:

    标签: sql-server recursion common-table-expression


    【解决方案1】:

    您是否正在寻找一个查询来返回可变数量的列,具体取决于层次结构的深度?还是只是一个字段中的串联字符串?

    这是对您的查询的一个小改动,它将使 Eric 和他之上的任何人进入层次结构。

    WITH    employeeMaster
          AS ( SELECT   p.EmployeeID ,
                        p.MgrID ,
                        p.NAME
               FROM     Employees p
               WHERE    p.NAME = 'Eric'
               UNION ALL
               SELECT   c.EmployeeID ,
                        c.MgrID ,
                        c.NAME
               FROM     employeeMaster cte
                        INNER JOIN Employees c ON c.EmployeeID = cte.MgrID
             )
    SELECT  *
    FROM    employeeMaster m
    

    【讨论】:

    • 使用我帖子中的表格示例,我想查询 Eric 并返回一个记录集,其中包含三个记录,显示他的记录和他上面的两个人。最终目标是能够查询任何员工并查看该员工的指挥链一直到最高层。
    • 总是简单的东西。标记为已回答。
    猜你喜欢
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 2017-08-31
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多