在工作當中會經常用到遞歸,比如菜單的展示。一種方法就是從數據庫中取出所有的數據,然后在程序中循環獲取符合條件的數據。另外一種方法就是使用SQL直接讀取符合條件的數據。對於遞歸查詢,T-SQL和PL/SQL進行了不同的處理。
以表Deparment為例
表結構為:
Id 部門內碼,
DeptCode 部門編碼,
ParentDeptId 上級部門內碼
使用T-SQL:
with Dep as ( select Id,DeptCode,DeptName from Department where Id=1 union all select d.Id,d.DeptCode,d.DeptName from Dep inner join Department d on dep.Id = d.ParentDeptId ) select * from Dep
簡單解釋一下:with as屬於sql server新特性CTE(Common Table Expression)的關鍵字,用來儲存臨時結果集。常用於代替子查詢。本例中可以理解為,找出Id=1的記錄后,存放在臨時表Dept中,然后臨時表和Department進行內連接,找出它的子記錄。子記錄和第一條記錄union后作為Dept新的結果集繼續進行內連接,找出新的子記錄。
使用PL/SQL:
select Id,DeptCode,DeptName from Department start with Id = 1 connect by prior Id = ParentDeptId;
start with 表示從哪一行記錄開始遞歸查詢,即根節點 connect by 表示進行遞歸,后面跟遞歸條件 prior 表示前一條記錄,表示上一條記錄的Id = 下一條記錄的ParentDeptId 比如上面的SQL語句就可以理解為,以Id 為1的記錄為根節點,遞歸查詢下一條記錄的ParentDeptId = 前一條記錄的Id
以上,對使用SQL進行遞歸查詢進行了簡單的總結,作為備忘錄吧,希望也可以對大家有所幫助,謝謝!