[英]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
這里最重要的一點是:
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.