上方廣告

2012年5月25日 星期五

T-SQL使用遞迴的方式來查詢同一資料表

最近要調整公司原有系統機制的時候,由於資料架構的關係不得以必須使用到SQL來遞迴查詢一些資料,一開始我的想法本來是跟程式的觀念一下寫一個Function然後遞迴呼叫自己,但想來想去覺得這樣好像怪怪的,資料量大的時候怕會有效能問題,於是就上Google查了一下,果然有SQL本身就有提供類似遞迴的語法(SQL Server2005+的版本才支援)。


相關的說明就不多說了,請自行參閱MSDN說明
--tempTable搜尋出來的暫存表格
--grouptable搜尋的主表-->  id:主表ID | parentid:上階部門ID | code:代碼(僅顯示用)
with tempTable (id,parentid,code) as
(
 --先查出首先要查詢的第一個節點
 select id,parentid,code from grouptable where id='D004'
 union all
 --將主表與暫存表Join,並且找出對應關係
 select a.id,a.code,a.parentid 
 from grouptable a
 inner join tempTable b on a.parentid=b.id
)
--找出遞迴查詢出來的結果
select * from tempTable order by dept_id