一直沒有在意過資料庫處理樹形數據的重要性,直到有一天朋友問起我關於樹形數據查詢的問題時才發現根本不會,正好這個時候也要用到遞歸進行樹形數據的查詢於是在網上查了一圈,語法總結如下 參考文獻:https://msdn.microsoft.com/query/dev10.query?appId=Dev10
一直沒有在意過資料庫處理樹形數據的重要性,直到有一天朋友問起我關於樹形數據查詢的問題時才發現根本不會,正好這個時候也要用到遞歸進行樹形數據的查詢於是在網上查了一圈,語法總結如下
參考文獻: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
效果如圖:
這2段代碼可以直接複製使用,修改一下表名和要查詢的列名基本上都是通用的,寫的比較簡單,如果大家有什麼意見建議請留言交流謝謝。