公用表表達式 (CTE) 具備一個重要的優勢,那就是可以引用其自身,從而建立遞歸 CTE。遞歸 CTE 是一個重複執行初始 CTE 以返回數據子集直到獲取完整結果集的公用表表達式。 當某個查詢引用遞歸 CTE 時,它即被稱爲遞歸查詢。遞歸查詢一般用於返回分層數據,例如:顯示某個組織圖中的僱員或物料清單方案(其中父級產品有一個或多個組件,而那些組件可能還有子組件,或者是其餘父級產品的組件)中的數據。 遞歸 CTE 能夠極大地簡化在 SELECT、INSERT、UPDATE、DELETE 或 CREATE VIEW 語句中運行遞歸查詢所需的代碼。在 SQL Server 的早期版本中,遞歸查詢一般須要使用臨時表、遊標和邏輯來控制遞歸步驟流。 遞歸查詢 **************建表******************** REATE TABLE [dbo].[Co_ItemNameSet]( [ItemId] [int] NULL, [ParentItemId] [int] NULL, [ItemName] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL ) ON [PRIMARY] *************插入數據*********************** --給表插入數據 insert into dbo.Co_ItemNameSet values(2,0,'管理費用') insert into dbo.Co_ItemNameSet values(3,0,'銷售費用') insert into dbo.Co_ItemNameSet values(4,0,'財務費用') insert into dbo.Co_ItemNameSet values(5,0,'生產成本') insert into dbo.Co_ItemNameSet values(35,5,'材料') insert into dbo.Co_ItemNameSet values(36,5,'人工') insert into dbo.Co_ItemNameSet values(37,5,'製造費用') insert into dbo.Co_ItemNameSet values(38,35,'原材料') insert into dbo.Co_ItemNameSet values(39,35,'主要材料') insert into dbo.Co_ItemNameSet values(40,35,'間輔材料') insert into dbo.Co_ItemNameSet values(41,36,'工資') insert into dbo.Co_ItemNameSet values(42,36,'福利') insert into dbo.Co_ItemNameSet values(43,2,'管理費用子項') insert into dbo.Co_ItemNameSet values(113,43,'管理費用子項的子項') **********************用CTE遞歸操做的sql語句以下:**************** DECLARE @i INT SELECT @i=2; WITH Co_ItemNameSet_CTE(ItemId,ParentItemId,ItemName,[Level]) AS ( SELECT ItemId,ParentItemId,ItemName,1 AS [Level] FROM Co_ItemNameSet WHERE itemid=@i UNION ALL SELECT c.ItemId,c.ParentItemId,c.ItemName,[Level] + 1 FROM Co_ItemNameSet c INNER JOIN Co_ItemNameSet_CTE ct ON c.ParentItemId=ct.ItemId ) SELECT * FROM Co_ItemNameSet_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(就是as裏的語句塊)。這些查詢定義被稱爲「遞歸成員」。 終止檢查。 終止檢查是隱式的;當上一個調用中未返回行時,遞歸將中止。 遞歸 CTE 結構必須至少包含一個定位點成員和一個遞歸成員。如下僞代碼顯示了包含一個定位點成員和一個遞歸成員的簡單遞歸 CTE 的組件。 WITH cte_name ( column_name [,...n] ) AS ( CTE_query_definition --定位點成員 UNION ALL CTE_query_definition --遞歸成員. ) 如今讓咱們看一下遞歸執行過程: 將 CTE 表達式拆分爲定位點成員和遞歸成員。 運行定位點成員,建立第一個調用或基準結果集 (T0)。 運行遞歸成員,將 Ti 做爲輸入,將 Ti+1 做爲輸出。 重複步驟 3,直到返回空集。 返回結果集。這是對 T0 到 Tn 執行 UNION ALL 的結果。