--匯入資料
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...