遞歸 CTE

公用表表達式 (CTE) 具備一個重要的優勢,那就是可以引用其自身,從而建立遞歸 CTE。遞歸 CTE 是一個重複執行初始 CTE 以返回數據子集直到獲取完整結果集的公用表表達式。

  當某個查詢引用遞歸 CTE 時,它即被稱爲遞歸查詢。遞歸查詢一般用於返回分層數據,例如:顯示某個組織圖中的僱員或物料清單方案(其中父級產品有一個或多個組件,而那些組件可能還有子組件,或者是其餘父級產品的組件)中的數據。

  遞歸 CTE 能夠極大地簡化在 SELECTINSERTUPDATEDELETECREATE 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 ALLUNIONEXCEPTINTERSECT 運算符聯接的 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 的結果。
相關文章
相關標籤/搜索