SQL递归函数列出父级的所有子级(ID ParentID模式)
2009-07-24 11:17
441 查看
--调用方法:
--select * from GetChild('24')
--select id from GetChild('24')
--select * from KuCun where ProductType in(select id from GetChild('24'))
Create function [dbo].[GetChild](@ID varchar(10))
returns @t table(ID varchar(10),ParentID varchar(10),Level int)
as
begin
declare @i int
set @i = 1
insert into @t select @ID,@ID,0 --当前级,本级,如果不要的话可以注释掉或再加个参数来选择操作
insert into @t select ID,ParentID,@i from Dept where ParentID = @ID
while @@rowcount<>0
begin
set @i = @i + 1
insert into @t
select
a.ID,a.ParentID,@i
from
Dept a,@t b
where
a.ParentID=b.ID and b.Level = @i-1
end
return
end
--------------------------------------------------------------------------------
--在SQL Server2005中其实提供了CTE[公共表表达式]来实现递归:
Declare @Id Int
Set @Id = 24; ---在此修改父节点
With RootNodeCTE(Id,ParentId)
As
(
Select Id,ParentId From Dept Where ParentId In (@Id)
Union All
Select Dept.Id,Dept.ParentId From RootNodeCTE
Inner Join Dept
On RootNodeCTE.Id = Dept.ParentId
)
Select * From RootNodeCTE
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--生成测试数据
create table Dept(ID int,ParentID int,msg varchar(20))
insert into Dept select 1,0,null
insert into Dept select 2,1,null
insert into Dept select 3,1,null
insert into Dept select 4,2,null
insert into Dept select 5,3,null
insert into Dept select 6,5,null
insert into Dept select 7,6,null
go
--创建用户定义函数
Create function [dbo].[GetChild](@ID varchar(10))
returns @t table(ID varchar(10),ParentID varchar(10),Level int)
as
begin
declare @i int
set @i = 1
insert into @t select @ID,@ID,0 --当前级,本级,如果不要的话可以注释掉或再加个参数来选择操作
insert into @t select ID,ParentID,@i from Dept where ParentID = @ID
while @@rowcount<>0
begin
set @i = @i + 1
insert into @t
select
a.ID,a.ParentID,@i
from
Dept a,@t b
where
a.ParentID=b.ID and b.Level = @i-1
end
return
end
--执行查询
select ID from dbo.GetChild(3)
go
--输出结果
/*
3
5
6
7
*/
--删除测试数据
drop function GetChild
drop table Dept
SQL递归函数列出父级的所有子级(ID ParentID模式) - 柳永法(yongfa365)'Blog http://www.yongfa365.com/Item/SQL-Di-Gui-Function-ID-ParentID.html
--select * from GetChild('24')
--select id from GetChild('24')
--select * from KuCun where ProductType in(select id from GetChild('24'))
Create function [dbo].[GetChild](@ID varchar(10))
returns @t table(ID varchar(10),ParentID varchar(10),Level int)
as
begin
declare @i int
set @i = 1
insert into @t select @ID,@ID,0 --当前级,本级,如果不要的话可以注释掉或再加个参数来选择操作
insert into @t select ID,ParentID,@i from Dept where ParentID = @ID
while @@rowcount<>0
begin
set @i = @i + 1
insert into @t
select
a.ID,a.ParentID,@i
from
Dept a,@t b
where
a.ParentID=b.ID and b.Level = @i-1
end
return
end
--------------------------------------------------------------------------------
--在SQL Server2005中其实提供了CTE[公共表表达式]来实现递归:
Declare @Id Int
Set @Id = 24; ---在此修改父节点
With RootNodeCTE(Id,ParentId)
As
(
Select Id,ParentId From Dept Where ParentId In (@Id)
Union All
Select Dept.Id,Dept.ParentId From RootNodeCTE
Inner Join Dept
On RootNodeCTE.Id = Dept.ParentId
)
Select * From RootNodeCTE
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--生成测试数据
create table Dept(ID int,ParentID int,msg varchar(20))
insert into Dept select 1,0,null
insert into Dept select 2,1,null
insert into Dept select 3,1,null
insert into Dept select 4,2,null
insert into Dept select 5,3,null
insert into Dept select 6,5,null
insert into Dept select 7,6,null
go
--创建用户定义函数
Create function [dbo].[GetChild](@ID varchar(10))
returns @t table(ID varchar(10),ParentID varchar(10),Level int)
as
begin
declare @i int
set @i = 1
insert into @t select @ID,@ID,0 --当前级,本级,如果不要的话可以注释掉或再加个参数来选择操作
insert into @t select ID,ParentID,@i from Dept where ParentID = @ID
while @@rowcount<>0
begin
set @i = @i + 1
insert into @t
select
a.ID,a.ParentID,@i
from
Dept a,@t b
where
a.ParentID=b.ID and b.Level = @i-1
end
return
end
--执行查询
select ID from dbo.GetChild(3)
go
--输出结果
/*
3
5
6
7
*/
--删除测试数据
drop function GetChild
drop table Dept
SQL递归函数列出父级的所有子级(ID ParentID模式) - 柳永法(yongfa365)'Blog http://www.yongfa365.com/Item/SQL-Di-Gui-Function-ID-ParentID.html
相关文章推荐
- SQL递归函数列出父级的所有子级(ID ParentID模式)
- SQL递归函数列出父级的所有子级(ID ParentID模式)
- SQL递归函数列出父级的所有子级(ID ParentID模式)
- SQL递归函数列出父级的所有子级(ID ParentID模式)
- SQL递归函数列出父级的所有子级
- mysql 根据子级id查询其所有的父级的
- sql 递归函数,根据父级ID获取所有子级(含自己)
- 无限极分类mysql存储过程编写实现调用时给定一个id,返回其所有父级与子级并排序
- 传递一个父id返回所有子id的用法,可用于删除父级以下的所有子级
- Mysql 根据id查所有父级或子级
- Mysql 根据id查所有父级或子级
- mysql sql 根据父级id查询书所有的子孙级数据,或根据子级id查询对应的父级
- 根据id查询出所有的父级和子级
- 根据子级ID获取其所有父级
- Hibernate跨级修改子级数据,Hibernate根据父级ID跨级修改子级数据
- mybatis根据父级编号获取所有的子级
- MSSQL 下递归CTE的应用通过父级获取所有对应的子级节点(一)
- With As 获取 id parentId 递归获取所有
- MSSQL 递归CTE的应用通过子级获取所有对应的父级及其本身(二)
- 学习笔记:无限级目录删除(ID-PID模式),根据ID删除下面所有子ID