SQL遞歸查詢(with cte as)
(
??? select Id,Pid,DeptName,0 as lvl from Department
??? where Id = 2
??? union all
??? select d.Id,d.Pid,d.DeptName,lvl+1 from cte c inner join Department d
??? on c.Id = d.Pid
)
select * from cte
----------- ----------- --------------------------------------------------
????????? 0?????????? 總部
????????? 1?????????? 研發部
????????? 1?????????? 測試部
????????? 1?????????? 質量部
????????? 2?????????? 小組1
????????? 2?????????? 小組2
????????? 3?????????? 測試1
????????? 3?????????? 測試2
????????? 5?????????? 前端組
???????? 5?????????? 美工
Id????????? Pid???????? DeptName?????????????????????????????????????????? lvl
----------- ----------- -------------------------------------------------- ----------- ???
???????????????? 1?????????? 研發部???????????????????????????????????????????????0 ?????????
?????????????????2?????????? 小組1??????????????????????????????????????????????? 1 ?????????
???????????????? 2?????????? 小組2??????????????????????????????????????????????? 1 ?????????
??????????????? ?5?????????? 前端組???????????????????????????????????????????????2 ????????
???????????????? 5?????????? 美工???????????????????????????????????????????????? ?2
(5 行受影響)
3 原理(摘自網上)
遞歸CTE最少包含兩個查詢(也被稱為成員)。第一個查詢為定點成員,定點成員只是一個返回有效表的查詢,用于遞歸的基礎或定位點。第二個查詢被稱為遞歸成員,使該查詢稱為遞歸成員的是對CTE名稱的遞歸引用是觸發。在邏輯上可以將CTE名稱的內部應用理解為前一個查詢的結果集。
遞歸查詢沒有顯式的遞歸終止條件,只有當第二個遞歸查詢返回空結果集或是超出了遞歸次數的最大限制時才停止遞歸。是指遞歸次數上限的方法是使用MAXRECURION。