SqlServer實現遞歸查詢

在一般的系統開發中,我們經常遇到一類問題:查詢出某條記錄以及與該條記錄相關的其他記錄。例如,現在需要查詢出西湖區以及西湖區所屬的市和省,這時候就需要用到SQL遞歸查詢。我在這裏構造了一張數據表[tb_Test],其數據如下所示:

Id	 Name	ParentId
1	浙江省	  NULL
2	杭州市	   1
3	湖州市	   1
4	濱江區	   2
5	拱墅區	   2
6	西湖區	   2
7	吳興區	   3
8	南潯區	   3
9	長興縣	   3

向下遞歸

假設我們現在需要查詢杭州市及其下屬的區縣,其代碼如下所示:

with cte as 
(
   select Id,Name,ParentId from [tb_Test] where Name='杭州市'
   union all
   select a.Id,a.Name,a.ParentId from [tb_Test] a inner join cte on a.ParentId=cte.Id
) select * from cte

結果如下所示:

Id	 Name	ParentId
2	杭州市	   1
4	濱江區	   2
5	拱墅區	   2
6	西湖區	   2

向上遞歸

假設現在需要查詢西湖區及其所屬的市和省,其代碼如下所示:

with cte as 
(
   select Id,Name,ParentId from [tb_Test] where Name='西湖區'
   union all
   select a.Id,a.Name,a.ParentId from [tb_Test] a inner join cte on a.Id=cte.ParentId
) select * from cte

結果如下所示:

Id	 Name	ParentId
6	西湖區	   2
2	杭州市	   1
1	浙江省	  NULL

遞歸分頁

很多時候我們需要分頁查詢數據,遞歸分頁查詢的代碼如下所示:

with cte as 
(
   select Id,Name,ParentId from [tb_Test] where Name='杭州市'
   union all
   select a.Id,a.Name,a.ParentId from [tb_Test] a inner join cte on a.ParentId=cte.Id
) select * from(select ROW_NUMBER() over(order by Id) as rid,* from cte) b where b.rid between 1 and 2

結果如下所示:

rid  Id	 Name	ParentId
1    2	杭州市	   1
2    4	濱江區	   2
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章