SQL递归函数列出父级的所有子级(ID ParentID模式)
2011-06-15 22:28
375 查看
--调用方法:
--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
--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模式)
- SQL递归函数列出父级的所有子级(ID ParentID模式)
- SQL递归函数列出父级的所有子级(ID ParentID模式)
- SQL递归函数列出父级的所有子级(ID ParentID模式)
- SQL递归函数列出父级的所有子级
- Mysql 根据id查所有父级或子级
- mysql sql 根据父级id查询书所有的子孙级数据,或根据子级id查询对应的父级
- Mysql 根据id查所有父级或子级
- 根据id查询出所有的父级和子级
- 根据子级ID获取其所有父级
- sql 递归函数,根据父级ID获取所有子级(含自己)
- mysql 根据子级id查询其所有的父级的
- 无限极分类mysql存储过程编写实现调用时给定一个id,返回其所有父级与子级并排序
- 传递一个父id返回所有子id的用法,可用于删除父级以下的所有子级
- sql如何根据父级Id得到所有下级的记录
- 无限级分类查找节点的所有子级和父级 (转载)
- 根据指定ID,返回包含该ID的所有父级记录
- With As 获取 id parentId 递归获取所有
- jquery父级元素获取所有子级元素
- PHP获取栏目的所有子级与孙级栏目的ID号