SqlServer 遞歸查詢樹形數據


一直沒有在意過數據庫處理樹形數據的重要性,直到有一天朋友問起我關於樹形數據查詢的問題時才發現根本不會,正好這個時候也要用到遞歸進行樹形數據的查詢於是在網上查了一圈,語法總結如下

參考文獻:https://msdn.microsoft.com/query/dev10.query?appId=Dev10IDEF1&l=ZH-CN&k=k(WITH_TSQL);k(SQL11.SWB.TSQLRESULTS.F1);k(SQL11.SWB.TSQLQUERY.F1);k(MISCELLANEOUSFILESPROJECT);k(DevLang-TSQL)&rd=true

 

一:簡單的樹形數據 代碼如下:

-- with一個臨時表(括號中是你要查詢的列名)
with temp(ID,PID,Name,curLevel)
as
(
--1初始查詢(這里的PID=-1 在我的數據中是最底層的根節點)
select ID,PID,Name,1 as level from dbo.T_ACL_OU 
where Deleted = 0 and PID = -1     
union all
--2遞歸條件
select a.ID,a.PID,a.Name, b.curLevel+1from T_ACL_OU a   --3這里的臨時表和原始數據表都必須使用別名,不然遞歸的時候不知道查詢的是那個表的列
inner join
temp b
on ( a.PID=b.id)  --這個關聯關系很重要,一定要理解一下誰是誰的父節點
)
select * from temp   --4遞歸完成后 一定不要少了這句查詢語句 否則會報錯

效果如圖:


這里要注意的地方是注釋中的 1——4 的部分

二:帶縮進的樹形數據 代碼如下:

with temp(ID,PID,Name,curLevel)
as
(
--初始查詢
select ID,PID,Name,1 as curLevel from dbo.T_ACL_OU 
where Deleted = 0 and PID = -1     
union all
--遞歸條件
select a.ID,a.PID, convert(nvarchar(100),CONVERT(nvarchar(100), REPLICATE ('    ', b.curLevel+1)+a.Name)) as Name , b.curLevel+1   --這里的 REPLICATE函數非常重要,用於縮進空格用。不懂得可以在SQLserver中選中后按F1鍵
from T_ACL_OU a 
inner join
temp b
on ( a.PID=b.id)
)
select ID,PID,Name,curLevel from temp

效果如圖:

三:查詢是否有子節點

with temp(ID,PID,HandNo,Name,curLevel,pLevel,haveChild)
as
(
--初始查詢
select ID,PID,HandNo,Name,1 as level,0 as pLevel,1 as haveChild from dbo.T_ACL_OU 
where Deleted = 0 and PID = -1     
union all
--遞歸條件
select a.ID,a.PID,a.HandNo,a.Name, b.curLevel+1,b.curLevel,haveChild = (case when exists(select 1 from T_ACL_OU where T_ACL_OU.PID=a.id) then 1 else 0 end)--(select 1 from T_ACL_OU where exists(select 1 from T_ACL_OU where a.PID=b.id)) 
from T_ACL_OU a 
inner join
temp b
on ( a.PID=b.id)
)
select * from temp order by pLevel

效果如圖:

這3段代碼可以直接復制使用,修改一下表名和要查詢的列名基本上都是通用的,寫的比較簡單,如果大家有什么意見建議請留言交流謝謝。


免責聲明!

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



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