簡體   English   中英

SQL Server 2008 R2需要幫助了解遞歸CTE

[英]SQL Server 2008 R2 Need help understanding recursive 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;

上面的查詢結果如下所示。

在此處輸入圖片說明

這是HR.employees表的圖片。

在此處輸入圖片說明

點擊查看大圖

我無法理解為什么代碼會遞歸。 我了解該表如何輸出所有員工,其中直接經理是經理,而經理的值為2,但是我不明白為什么代碼會遞歸並產生員工在Empid 2下的下屬。

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

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

這將選擇您的最高員工。

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

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中已經存在的記錄與源表中的記錄連接起來。 這將一直執行到調用遞歸部分不返回任何記錄為止。
  • 當您的加入條件將一個雇員與其經理聯系起來時,只要有新雇員在先前迭代中已返回的人員下工作,則遞歸部分將繼續生成記錄。

我還要在此處輸入該主題的輸入鏈接描述中的一部分,以正式方式進行解釋:

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

遞歸CTE包含三個元素:

  • 例程的調用。

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

  • 例程的遞歸調用。

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

  • 終止檢查。

終止檢查是隱式的; 如果上次調用沒有返回行,則遞歸停止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM