树状sql--采用递归方式获取节点

Posted 九幽旋律

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状sql--采用递归方式获取节点相关的知识,希望对你有一定的参考价值。

创建数据库

create table City
(
id varchar(3) primary key ,
pid varchar(3) ,
name varchar(10)
)

插入数据

insert into City values(\'001\' , null , \'广东省\');
insert into City values(\'002\' , \'001\' , \'广州市\');
insert into City values(\'003\' , \'001\' , \'深圳市\') ;
insert into City values(\'004\' , \'002\' , \'天河区\') ;
insert into City values(\'005\' , \'003\' , \'罗湖区\');
insert into City values(\'006\' , \'003\' , \'福田区\') ;
insert into City values(\'007\' , \'003\' , \'宝安区\') ;
insert into City values(\'008\' , \'007\' , \'西乡镇\') ;
insert into City values(\'009\' , \'007\' , \'龙华镇\');
insert into City values(\'010\' , \'007\' , \'松岗镇\');

insert into City values(\'011\' , null , \'中国\');  

 

递归子节点的存储过程:

create proc ProcCity
@id nvarchar(36)
as
begin
with cte as
(
select a.id,a.name,a.pid from City a where id=@id
union all
select k.id,k.name,k.pid from City k inner join cte c on c.id = k.pid
)select * from cte
end

获取深圳以及深圳的所有区:exec ProcCity \'003\'

 

递归父节点的存储过程:

create proc ProcCity
@id nvarchar(36)
as
begin
with cte as 

select a.id,a.name,a.pid from City a where id=@id 
union all 
select k.id,k.name,k.pid from City k inner join cte c on k.id = c.pid 
)select * from cte 
end

获取深圳以及深圳的所有父节点:exec ProcCity \'003\'

 

以上是关于树状sql--采用递归方式获取节点的主要内容,如果未能解决你的问题,请参考以下文章

SQL递归获取所有父节点的函数

获取子父节点,tree树状结构的方式--通过循环的方式

sql server使用cte递归查询获取树形的父节点/子节点

tree状数据叶子节点与根节点等的递归转换

Sql查询树状结构下级子节点的数量

在递归 SQL 查询中使用全局列表来避免访问节点