SQL 递归找查所有子节点及所有父节
2014-08-22 11:14
106 查看
在SQL的树型结构中,很多时候,知道某一节点的值,需要查找该节点的所有子节点(包括多级)的功能,这时就需要用到如下的用户自定义函数.
表结构如下:
用户自定义函数如下:
create function f_getChild(@ID VARCHAR(10))
returns @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
as
begin
declare @i int,@ret varchar(8000)
set @i = 1
insert into @t select ID,Dep_FathID,@i from H_Dep_Info where Dep_FathID = @ID
while @@rowcount<>0
begin
set @i = @i + 1
insert into @t select a.ID,a.Dep_FathID,@i from H_Dep_Info a,@t b where a.Dep_FathID=b.ID and b.Level = @i-1
end
return
end
执行操作如下:
select ID from f_getChild(1)
返回值就是所有的子节点
查找父节点的函数如下:
CREATE FUNCTION [f_getParent](@id int)
RETURNS @re TABLE(id int,pid int,level int)
AS
begin
declare @level int
set @level = 1
declare @pid int
select @pid = pid from tb where id = @id
insert @re
select id,pid,@level from tb where id = @pid
while @@rowcount > 0
begin
set @level = @level + 1
select @pid = pid from tb where id = @pid
insert @re
select id,pid,@level from tb where id = @pid
end
return
end
执行操作如下:
select * from f_getParent(8)
返回的列有id,pid,level
其中id就是8的父节点,pid就是id的父节点,level就是级数(表示这个id是8的第几级你节点)
表结构如下:
ID | int |
Dep_Type | int |
Dep_Code | varchar(50) |
Dep_Name | varchar(50) |
Dep_Dian | int |
Dep_FathID | int |
Dep_Opera | varchar(50) |
Dep_Status | int |
Dep_AddTime | datetime |
create function f_getChild(@ID VARCHAR(10))
returns @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
as
begin
declare @i int,@ret varchar(8000)
set @i = 1
insert into @t select ID,Dep_FathID,@i from H_Dep_Info where Dep_FathID = @ID
while @@rowcount<>0
begin
set @i = @i + 1
insert into @t select a.ID,a.Dep_FathID,@i from H_Dep_Info a,@t b where a.Dep_FathID=b.ID and b.Level = @i-1
end
return
end
执行操作如下:
select ID from f_getChild(1)
返回值就是所有的子节点
查找父节点的函数如下:
CREATE FUNCTION [f_getParent](@id int)
RETURNS @re TABLE(id int,pid int,level int)
AS
begin
declare @level int
set @level = 1
declare @pid int
select @pid = pid from tb where id = @id
insert @re
select id,pid,@level from tb where id = @pid
while @@rowcount > 0
begin
set @level = @level + 1
select @pid = pid from tb where id = @pid
insert @re
select id,pid,@level from tb where id = @pid
end
return
end
执行操作如下:
select * from f_getParent(8)
返回的列有id,pid,level
其中id就是8的父节点,pid就是id的父节点,level就是级数(表示这个id是8的第几级你节点)
相关文章推荐
- SQL 递归找查所有子节点及所有父节
- SQL递归查询子节点对应所有父节点
- 在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)
- sql 根据父节点查找所有子节点
- 递归(抓出某节点下面的所有的子孙节点)----简单版
- ORACLE SQL 取出组织下所有用户的信息,递归地取下级组织的用户
- C#,net查找一个Node所有子节点,演示递归调用
- [Oracle PL/SQL]当数据表设计成具有父ID的时候,当需要选择所有与父ID同根生的所有节点的时候,使用的SQL语句
- 天天SQL(查询所有子节点及其函数的练习)
- 递归删除父节点及所有子节点
- 如何用一段SQL语句递归找到一个目录下的所有子目录...
- SQL 遍历父子关系表(二叉树)获得所有子节点 所有父节点
- [ASP.net]TreeView(1)(一次性递归所有节点)
- sql 根据父节点查找所有子节点
- sql通过一个节点ID得到所有子节点
- 递归获取treeview选中父节点的所有子节点
- sql 语句:根据父节点查找所有子节点
- TreeView(一次性递归所有节点)
- sql 根据父节点查找所有子节点
- sql 根据根节点遍历所有叶子