CTE(Common Table Expressions)是從SQL Server 2005以后版本才有的。指定的臨時命名結(jié)果集,這些結(jié)果集稱為CTE。 與派生表類似,不存儲為對象,并且只在查詢期間有效。與派生表的不同之處在于,CTE 可自引用,還可在同一查詢中引用多次。使用CTE能改善代碼可讀性,且不損害其性能。
遞歸CTE是SQL SERVER 2005中重要的增強(qiáng)之一。一般我們在處理樹,圖和層次結(jié)構(gòu)的問題時需要用到遞歸查詢。
CTE的語法如下
WITH CTE AS
(
SELECT EmpId, ReportTo, FName FROM Employ WHERE EmpId=
UNION ALL
SELECT emp.EmpId, emp.ReportTo, emp.FName FROM CTE JOIN Employ as emp ON CTE.EmpId=emp.ReportTo
)
遞歸CTE最少包含兩個查詢(也被稱為成員)。第一個查詢?yōu)槎c(diǎn)成員,定點(diǎn)成員只是一個返回有效表的查詢,用于遞歸的基礎(chǔ)或定位點(diǎn)。第二個查詢被稱為遞歸成員,使該查詢稱為遞歸成員的是對CTE名稱的遞歸引用是觸發(fā)。在邏輯上可以將CTE名稱的內(nèi)部應(yīng)用理解為前一個查詢的結(jié)果集。
遞歸查詢沒有顯式的遞歸終止條件,只有當(dāng)?shù)诙€遞歸查詢返回空結(jié)果集或是超出了遞歸次數(shù)的最大限制時才停止遞歸。是指遞歸次數(shù)上限的方法是使用MAXRECURION。
USE AdventureWorks;
GO
--Creates an infinite loop
WITH cte (EmployeeID, ManagerID, Title) as
(
SELECT EmployeeID, ManagerID, Title
FROM HumanResources.Employee
WHERE ManagerID IS NOT NULL
UNION ALL
SELECT cte.EmployeeID, cte.ManagerID, cte.Title
FROM cte
JOIN HumanResources.Employee AS e
ON cte.ManagerID = e.EmployeeID
)
--Uses MAXRECURSION to limit the recursive levels to
SELECT EmployeeID, ManagerID, Title
FROM cte
OPTION (MAXRECURSION );
GO
以上內(nèi)容就是本文給大家介紹的使用SqlServer CTE遞歸查詢處理樹、圖和層次結(jié)構(gòu),希望大家喜歡。
您可能感興趣的文章:- 在sqlserver中如何使用CTE解決復(fù)雜查詢問題
- SQLSERVER2008中CTE的Split與CLR的性能比較
- 使用SQLSERVER 2005/2008 遞歸CTE查詢樹型結(jié)構(gòu)的方法
- SQLSERVER2005 中樹形數(shù)據(jù)的遞歸查詢
- sqlserver另類非遞歸的無限級分類(存儲過程版)
- SqlServer使用公用表表達(dá)式(CTE)實(shí)現(xiàn)無限級樹形構(gòu)建