2011-03-03 89 views
5

我目前正在运行CTE查询以递归方式从雇员表中构建雇员层次结构,类似于大多数递归示例演示的内容。我陷入困境的是,我正试图查询单个员工并检索他上方的层次结构。下面是我想要的工作表的例子有:SQL 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返回他上方的层次结构。似乎这应该很容易,但我无法在我的生活中发现它。

回答

8

您是否正在查询返回可变数量的列,具体取决于层次的深度?或者只是一个字段中的连接字符串?

这是对您的查询的一个小改动,它将让埃里克和他之上的任何人在层次结构中。使用

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 
+0

表例如在我的帖子,我想查询Eric和三个记录显示他的纪录,两个人比他返回一个记录。最终目标是对任何员工进行可疑查询,并将该员工的指挥链一直看到顶端。 – Tehrab 2011-03-03 23:36:49

+0

我编辑给你埃里克和他的经理。 – 2011-03-03 23:52:38

+0

永远是简单的东西。标记为已回答。 – Tehrab 2011-03-04 00:15:42