一、遞歸查詢
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
查詢結果: