公用表表示式 (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...