使用公用表表示式的遞迴查詢(CTE)

2021-06-10 04:43:44 字數 1888 閱讀 1349

公用表表示式 (cte) 具有乙個重要的優點,那就是能夠引用其自身,從而建立遞迴 cte。遞迴 cte 是乙個重複執行初始 cte 以返回資料子集直到獲取完整結果集的公用表表示式。

當某個查詢引用遞迴 cte 時,它即被稱為遞迴查詢。遞迴查詢通常用於返回分層資料,例如:顯示某個組織圖中的雇員或物料清單方案(其中父級產品有乙個或多個元件,而那些元件可能還有子元件,或者是其他父級產品的元件)中的資料。

遞迴 cte 可以極大地簡化在 select、insert、update、delete 或 create view 語句中執行遞迴查詢所需的**。cte是sql2005新增的功能,sql2000不支援cte。

遞迴 cte 由下列三個元素組成:

遞迴 cte 的第乙個呼叫包括乙個或多個由 union all、union、except 或 intersect 運算子聯接的 cte_query_definitions。由於這些查詢定義形成了 cte 結構的基準結果集,所以它們被稱為「定位點成員」。

cte_query_definitions 被視為定位點成員,除非它們引用了 cte 本身。所有定位點成員查詢定義必須放置在第乙個遞迴成員定義之前,而且必須使用 union all 運算子聯接最後乙個定位點成員和第乙個遞迴成員。

遞迴呼叫包括乙個或多個由引用 cte 本身的 union all 運算子聯接的 cte_query_definitions。這些查詢定義被稱為「遞迴成員」。

終止檢查是隱式的;當上乙個呼叫中未返回行時,遞迴將停止。

use a

go-- 建立表並插入資料

create table ctetable(id int identity(1,1),[name] varchar(20),parentid int)

insert into ctetable

select 'd盤',0 union all

select 'programfiles',1 union all

select 'test1',2 union all

select 'test2',2

-- 我們查詢programfiles下面所有檔案有那些?

;with mycte(id,[name],parentid) as

( select id,[name],parentid

from ctetable where [name] = 'programfiles'

union all

select e.id,e.[name],e.parentid

from ctetable as e,mycte as c where e.parentid = c.id

)select id,[name],parentid from mycte

id name parentid

--------- -------------------- -----------

2 programfiles 1

3 test1 2

4 test2 2

(3 行受影響)

遞迴 cte  定義了乙個定位點成員和乙個遞迴成員。

定位點成員返回基準結果集 t0。即'programfiles'。

遞迴成員返回定位點成員結果集中的programfiles的下層檔案。這是通過在 ctetable 表和 mycte 之間執行聯接操作獲得的。正是此次對 cte 自身的引用建立了遞迴呼叫。聯接 e.parentid = c.id  返回programfiles 下的檔案作為輸出。這樣,遞迴成員的第一次迭代返回了 test1、test2結果。

假如test1或者test2下還有子檔案,則會啟用遞迴成員,直到遞迴結束.

使用公用表表示式的遞迴查詢

微軟從sql2005起引入了cte common table expression 以強化t sql。公用表表示式 cte 具有乙個重要的優點,那就是能夠引用其自身,從而建立遞迴 cte。遞迴 cte 是乙個重複執行初始 cte 以返回資料子集直到獲取完整結果集的公用表表示式。當某個查詢引用遞迴 c...

公用表表示式 CTE 遞迴

指定臨時命名的結果集,這些結果集稱為公用表表示式 cte 公用表表示式可以包括對自身的引用。這種表示式稱為遞迴公用表表示式。對於遞迴公用表示式來說,實現原理也是相同的,同樣需要在語句中定義兩部分 在sql這兩部分通過union all連線結果集進行返回 with cte as select id,p...

公用表表示式

公用表表示式 common table expressions 假設我們有乙個100w條資料的訂單表,需要分頁查詢。declare rownumber asint,pagenumber asint set rownumber 5 set pagenumber 2 with orderedorders...