2014-03-03 68 views
1

我需要幫助理解這個查詢的遞歸部分:上面如下所示的查詢SQL Server 2008 R2中的極品幫助理解遞歸CTE

WITH EmpsCTE AS 
(
    SELECT empid, mgrid, firstname, lastname 
    FROM HR.Employees 
    WHERE empid = 2 

    UNION ALL 

    SELECT C.empid, C.mgrid, C.firstname, C.lastname 
    FROM EmpsCTE AS P 
     JOIN HR.Employees AS C 
      ON C.mgrid = P.empid 
) 

SELECT empid, mgrid, firstname, lastname 
FROM EmpsCTE; 

結果。

enter image description here

這裏是HR.EMPLOYEES表的圖片。

enter image description here

Click for enlarged version

我無法理解爲什麼代碼遞歸。我理解表格如何輸出直接經理爲2的empid的所有員工,但我不明白爲什麼代碼遞歸併生成empid 2下的員工的下屬。

回答

1

使用CTE的遞歸查詢像上面通常由CTE定義中的兩部分組成。第一個獲得記錄,您將開始從(定位記錄)遞歸

SELECT empid, mgrid, firstname, lastname 
FROM HR.Employees 
WHERE empid = 2 

這將選擇您的最頂級員工。

然後實現遞歸需要UNION與CTE查詢的第二部分(以獲得遞歸記錄):

UNION ALL 

SELECT C.empid, C.mgrid, C.firstname, C.lastname 
FROM EmpsCTE AS P 
    JOIN HR.Employees AS C 
     ON C.mgrid = P.empid 

最重要的這裏的要點是:

  • 你需要加入CTE定義中使用的別名(EmpsCTE)和源表(HR.Employees)。這將產生遞歸,因爲它將使用源表中的記錄連接已存在於CTE中的記錄。這將一直執行,直到recive部分的調用不返回任何記錄。
  • 作爲您的連接條件將員工鏈接到其經理,遞歸部分將繼續生成記錄,只要有新員工在查詢已在之前的迭代中返回的那些人員下工作。

讓我也粘貼enter link description here一節關於這一主題來解釋它的正式方式:

遞歸CTE的Transact-SQL中的結構類似於其他編程語言中的遞歸例程。雖然其他語言的遞歸例程返回標量值,但遞歸CTE可以返回多行。

遞歸CTE由三個部分組成:

例程的
  • 調用。

第一次遞歸CTE的調用由一個或多個由UNION ALL,UNION,EXCEPT或INTERSECT運算符連接的CTE_query_definitions組成。由於這些查詢定義形成了CTE結構的基本結果集,因此它們被稱爲定位成員。 CTE_query_definitions被視爲錨定成員,除非他們引用了CTE本身。所有錨定成員查詢定義必須位於第一個遞歸成員定義之前,並且必須使用UNION ALL運算符將最後一個錨定成員與第一個遞歸成員進行連接。

  • 遞歸調用例程。

遞歸調用包括一個或多個引用CTE本身的UNION ALL運算符連接的CTE_query_definitions。這些查詢定義被稱爲遞歸成員。

  • 終止檢查。

終止檢查是隱含的;當前一次調用沒有行時,遞歸停止。