1. 程式人生 > >Sql遞迴(用with 實現遞迴查詢)

Sql遞迴(用with 實現遞迴查詢)

1.遞迴原理(摘自網上

   遞迴CTE最少包含兩個查詢(也被稱為成員)。第一個查詢為定點成員,定點成員只是一個返回有效表的查詢,用於遞迴的基礎或定位點。第二個查詢被稱為遞迴成員,使該查詢稱為遞迴成員的是對CTE名稱的遞迴引用是觸發。在邏輯上可以將CTE名稱的內部應用理解為前一個查詢的結果集。

遞迴查詢沒有顯式的遞迴終止條件,只有當第二個遞迴查詢返回空結果集或是超出了遞迴次數的最大限制時才停止遞迴。是指遞迴次數上限的方法是使用MAXRECURION。

Sql遞迴的優點:效率高,大量資料集下,速度比程式的查詢快。

2.資料模擬

select '01' as Code,'北京市' Name,'0' parentCode,1 level union all
select '02' as Code,'河南省' Name,'0' parentCode,1 level union all
select '0101' ,'海淀區','01',2 union all
select '010101' ,'上地','0101',3 union all 
select '010102' ,'清河','0101',3 union all
select '0102' ,'西城區','01',2 union all
select '0103' ,'東城區','01',2 union all
select '0201' ,'安陽市','02',2 union all
select '020101' ,'林州','0201',3 union all 
select '020102' ,'滑縣','0201',3 union all
select '0202' ,'落陽市','02',2 

3.遞迴查詢北京對應下級資料

with T as
(--模擬測試資料
select '01' as Code,'北京市' Name,'0' parentCode,1 level union all
select '02' as Code,'河南省' Name,'0' parentCode,1 level union all
select '0101' ,'海淀區','01',2 union all
select '010101' ,'上地','0101',3 union all 
select '010102' ,'清河','0101',3 union all
select '0102' ,'西城區','01',2 union all
select '0103' ,'東城區','01',2 union all
select '0201' ,'安陽市','02',2 union all
select '020101' ,'林州','0201',3 union all 
select '020102' ,'滑縣','0201',3 union all
select '0202' ,'落陽市','02',2 
)
,A as(--遞迴方法
select Code,Name,parentCode,level from T where Code='01'
union all
select T.Code,T.Name,T.parentCode,t.level from T 
inner join A on T.parentCode=A.Code 
)
--遞迴查詢北京資料
select * from A ;