使用SQL进行递归查询
在工作當(dāng)中會經(jīng)常用到遞歸,比如菜單的展示。一種方法就是從數(shù)據(jù)庫中取出所有的數(shù)據(jù),然后在程序中循環(huán)獲取符合條件的數(shù)據(jù)。另外一種方法就是使用SQL直接讀取符合條件的數(shù)據(jù)。對于遞歸查詢,T-SQL和PL/SQL進(jìn)行了不同的處理。
以表Deparment為例
表結(jié)構(gòu)為:
Id 部門內(nèi)碼,
DeptCode 部門編碼,
ParentDeptId 上級部門內(nèi)碼
使用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 .csharpcode, .csharpcode pre { font-size: small; color: rgba(0, 0, 0, 1); font-family: consolas, "Courier New", courier, monospace; background-color: rgba(255, 255, 255, 1) } .csharpcode pre { margin: 0 } .csharpcode .rem { color: rgba(0, 128, 0, 1) } .csharpcode .kwrd { color: rgba(0, 0, 255, 1) } .csharpcode .str { color: rgba(0, 96, 128, 1) } .csharpcode .op { color: rgba(0, 0, 192, 1) } .csharpcode .preproc { color: rgba(204, 102, 51, 1) } .csharpcode .asp { background-color: rgba(255, 255, 0, 1) } .csharpcode .html { color: rgba(128, 0, 0, 1) } .csharpcode .attr { color: rgba(255, 0, 0, 1) } .csharpcode .alt { background-color: rgba(244, 244, 244, 1); width: 100%; margin: 0 } .csharpcode .lnum { color: rgba(96, 96, 96, 1) }簡單解釋一下:with as屬于sql server新特性CTE(Common Table Expression)的關(guān)鍵字,用來儲存臨時結(jié)果集。常用于代替子查詢。本例中可以理解為,找出Id=1的記錄后,存放在臨時表Dept中,然后臨時表和Department進(jìn)行內(nèi)連接,找出它的子記錄。子記錄和第一條記錄union后作為Dept新的結(jié)果集繼續(xù)進(jìn)行內(nèi)連接,找出新的子記錄。
使用PL/SQL:
select Id,DeptCode,DeptName from Department start with Id = 1 connect by prior Id = ParentDeptId;start with 表示從哪一行記錄開始遞歸查詢,即根節(jié)點 connect by 表示進(jìn)行遞歸,后面跟遞歸條件 prior 表示前一條記錄,表示上一條記錄的Id = 下一條記錄的ParentDeptId 比如上面的SQL語句就可以理解為,以Id 為1的記錄為根節(jié)點,遞歸查詢下一條記錄的ParentDeptId = 前一條記錄的Id
以上,對使用SQL進(jìn)行遞歸查詢進(jìn)行了簡單的總結(jié),作為備忘錄吧,希望也可以對大家有所幫助,謝謝!
總結(jié)
以上是生活随笔為你收集整理的使用SQL进行递归查询的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 建行网上申请换卡不换号
- 下一篇: 财政存款主要包括哪些内容