在一般的系統開發中,我們經常遇到一類問題:查詢出某條記錄以及與該條記錄相關的其他記錄。例如,現在需要查詢出西湖區以及西湖區所屬的市和省,這時候就需要用到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