2011-03-03 137 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