【SQLSERVER】遞歸查詢算法實例


一、遞歸查詢

      1.結構: 遞歸CTE最少包含兩個查詢(也被稱為成員)。

                第一個查詢為定點成員,定點成員只是一個返回有效表的查詢,用於遞歸的基礎或定位點。

                第二個查詢被稱為遞歸成員,使該查詢稱為遞歸成員的是對CTE名稱的遞歸引用是觸發。在邏輯上可以將CTE名稱的內部應用理解為前一個查詢的結果集。

      2.遞歸結束條件:

                第二個遞歸查詢返回空結果集或是超出了遞歸次數的最大限制時才停止遞歸。

      3.Sql遞歸的優點:

                效率高,大量數據集下,速度比程序的查詢快。

      4.遞歸查詢的作用:

                用來查詢指定成員及其遞歸成員(下屬所有成員,包括下屬的下屬)

      5.適用場景:

                成員權限查詢、等級區域查詢,其他相關類似查詢。

二、實例

      數據准備:    

/*
test表
ID        地區ID
Name      地區名稱 
Main_ID   地區所屬上級ID
Sign      地區等級 例如:福建-廈門-湖里 分別是 1,2,3
*/
SELECT     1003    ID,    '福建'    Name,    0    Main_ID,    1 Sign INTO test    union all
SELECT     1050    ,    '福州'    ,    1003    ,    2    union all
SELECT     1051    ,    '廈門'    ,    1003    ,    2    union ALL
SELECT     1375    ,    '思明'    ,    1051    ,    3    union all
SELECT     1382    ,    '海滄'    ,    1051    ,    3    union all
SELECT     1381    ,    '湖里'    ,    1051    ,    3    union all
SELECT     1374    ,    '集美'    ,    1051    ,    3    union all
SELECT     1373    ,    '同安'    ,    1051    ,    3    union all
SELECT     1380    ,    '翔安'    ,    1051    ,    3    union ALL
SELECT     667582720122    ,    '鼓樓'    ,    1050    ,    3    union all
SELECT     667582725528    ,    '台江'    ,    1050    ,    3    union all
SELECT     667582729587    ,    '倉山'    ,    1050    ,    3    union all
SELECT     667582732602    ,    '馬尾'    ,    1050    ,    3    union all
SELECT     667582735385    ,    '晉安'    ,    1050    ,    3    union all
SELECT     667582738507    ,    '閩侯'    ,    1050    ,    3    union all
SELECT     667582742586    ,    '連江'    ,    1050    ,    3    union all
SELECT     667582745634    ,    '羅源'    ,    1050    ,    3    union all
SELECT     667582748358    ,    '閩清'    ,    1050    ,    3    union all
SELECT     667582751824    ,    '永泰'    ,    1050    ,    3    union all
SELECT     667582755215    ,    '平潭'    ,    1050    ,    3    union all
SELECT     667582760309    ,    '福清'    ,    1050    ,    3    union all
SELECT     667582764565    ,    '長樂'    ,    1050    ,    3    

 

   實例:

/*
查詢:福建省(ID 1003)及其底下的所有地區
*/
WITH CTE AS 
(
--父項
SELECT ID,Main_ID 
FROM test WHERE ID=1003
UNION ALL 
--遞歸結果集中的下級 
SELECT a.ID,a.Main_ID 
FROM test a
INNER JOIN CTE b ON b.ID=a.Main_ID
)

SELECT a.* 
FROM Test a
INNER JOIN CTE t ON a.ID=t.ID

     查詢結果:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM