CTE遞迴查詢

2022-01-22 08:20:54 字數 2701 閱讀 6523

--

匯入資料

create

table

dbo.dt_user

( userid

int,

managerid

int,

name

nvarchar(10))

insert

into

dbo.dt_user

select

1,-1,n'

boss

'union

allselect

11,1,n'a1'

union

allselect

12,1,n'a2'

union

allselect

13,1,n'a3'

union

allselect

111,11,n'b1'

union

allselect

112,11,n'b2'

union

allselect

121,12,n'

c1'

--

cte的簡單例子

with cte as

(select userid,managerid,name,name as

managername

from

dbo.dt_user

where managerid=-

1union

allselect c.userid,c.managerid,c.name,p.name as

managername

from

cte p

inner

join

dbo.dt_user c

on p.userid=

c.managerid

)select

userid,managerid,name,managername

from

cteorder

by userid

第乙個子查詢稱作定點(anchor)子查詢:定點查詢只是乙個返回有效表的查詢,用於設定遞迴的初始值;

第二個子查詢稱作遞迴子查詢:該子查詢呼叫cte名稱,觸發遞迴查詢,實際上是遞迴子查詢呼叫遞迴子查詢;

兩個子查詢使用union all,求並集;

遞迴查詢沒有顯式的遞迴終止條件,只有當遞迴子查詢返回空結果集(沒有資料行返回)或是超出了遞迴次數的最大限制時,才停止遞迴。

step1:定點子查詢設定cte的初始值,即cte的初始值set0;遞迴呼叫的子查詢過程:遞迴子查詢呼叫遞迴子查詢;

step2:遞迴子查詢第一次呼叫cte名稱,cte名稱是指cte的初始值set0,第一次執行遞迴子查詢之後,cte名稱是指結果集set1;

step3:遞迴子查詢第二次呼叫cte名稱,cte名稱是指set1,第二次執行遞迴子查詢之後,cte名稱是指結果集set2;

step4:在第n次執行遞迴子查詢時,cte名稱是指set(n-1),遞迴子查詢都引用前乙個遞迴子查詢的結果集;

step5:如果遞迴子查詢返回空資料行,或超出遞迴次數的最大限制,停止遞迴;

--

查詢所有子節點

with fcte as

(

select contentid,fathercontentid,0

aslevel

from productseries_content as

psc

where fathercontentid =

1union

allselect b.contentid,b.fathercontentid,a.level+1

aslevel

from fcte as

a

inner

join productseries_content as

b

on a.contentid =

b.fathercontentid

)select

*from

fcte

--查詢所有父節點

with tcte as

(

select contentid,fathercontentid from productseries_content as

psc

where contentid =

260union

allselect b.contentid,b.fathercontentid from tcte as

a

inner

join productseries_content as

b

on a.fathercontentid =

b.contentid

)select

*from

tcte

--補充2點

--the statement terminated. the maximum recursion 100 has been exhausted before statement completion.

--遞迴次數超過100次,要設定遞迴次數限制

option(maxrecursion 0)--

注意!注意!注意! contentid的值不能等於fathercontentid,這樣資料會無限遞迴

mssql多級查詢 CTE遞迴

最近做乙個製造業專案中涉及到打包問題,其模式為 乙個a b c 可以無限打包,a包含b,b包含c等。之間遇到了 1 打包後包裹數量需要更新,更新時必須對他的父級包號也進行更新,所以必須查詢出某個包號對應的所有父級包號 2 拆包 將包裹拆除,希望把a下面的包裹號也連同一起拆除,這樣必須查詢出某個包號對...

sql server利用cte遞迴查詢

with cte id,name,parent id as select id,name,parent id from sc district where name 巴中市 union all select sd.id,sd.name,sd.parent id from sc district sd...

Sql Server 使用CTE實現遞迴查詢

遞迴cte是sql server 2005中重要的增強之一。一般我們在處理樹,圖和層次結構的問題時需要用到遞迴查詢。cte的語法如下 1with cte as2 3select empid,reportto,fname from employ where empid 1 4union all5 se...