MSSQL树算法,常用的树的形成.以前看过用游标和递归写的,窃以为SQL用递归是大忌,所以自己写了一个,代码量和清晰度都还行.
http://love.winlin.cn/algorithm/mssqlTree.rar
--table:oaBBS.Type
--function:获取类型树中指定节点的所有子节点,以及本身
--author:winlin
--date:2006-10-24
ALTER function dbo.fun_oaBBS_typeTree_GetAllChildrensAndSelf
(
@nodeId int
)
--返回指定节点的所有子节点.
returns @nodes TABLE (tid int)
AS
begin
--设定初值
insert into @nodes(tid)values(@nodeId)
--循环选取指定节点的子节点
while 1=1
begin
--存储表的记录数目
declare @old int
select @old=count(*) from @nodes
--循环选取表的所有子节点
insert into @nodes(tid)
select t.topicId from oaBBS_Topic t,@nodes n
where t.parentId=n.tid --子节点
and t.topicId not in --不重复
(select * from @nodes)
--计算新节点
declare @new int
select @new=count(*) from @nodes
--判断是否选取完毕
if @new=@old
break
end
return
end
--程序分析
/*
1.利用表的t1.parentId=t2.id特性选取数据.
2.每次都选取表变量的子节点,直到全部选取.
3.循环分析:
若topic表如下:
id parentId
1 0
2 1
3 1
4 3
5 3
6 0
那么,执行本函数:
select * from fun_oaBBS_typeTree_GetChildrens(1)
一.初值
@nodes.tid
1
二.第一次循环:
选取topic中1的所有子节点,2和3插入表变量
@nodes.tid
1
2
3
三.第三次循环:
选取topic中@nodes的所有子节点,4和5入选
1
2
3
4
5
四.循环结束,退出.
*/
--table:oaBBS.Type
--function:获取类型树中指定节点的所有子节点.
--author:winlin
--date:2006-10-24
ALTER function dbo.fun_oaBBS_typeTree_GetAllChildrens
(
@nodeId int
)
--返回指定节点的所有子节点.
returns @nodes TABLE (tid int)
AS
begin
insert into @nodes(tid)
select * from fun_oaBBS_typeTree_GetAllChildrensAndSelf(@nodeId)
--移除自己
delete @nodes where tid=@nodeId
return
end
--table:oaBBS.Type
--function:获取类型树中指定节点的所有父节点
--author:winlin
--date:2006-10-24
ALTER function dbo.fun_oaBBS_typeTree_GetAllParents
(
@nodeId int
)
--返回指定节点的所有子节点.
returns @nodes TABLE (tid int)
AS
begin
--存储当前的id
declare @curId int
set @curId=@nodeId
--循环选取指定节点的子节点
while 1=1
begin
--父节点
declare @pId int
select @pId=parentId from oaBBS_Topic where topicId=@curId
--判断是否选取完毕
if @pId=0 or @pId=@curId
break
--更新当前节点到父节点
set @curId=@pId
--存储父节点
insert into @nodes(tid)values(@pId)
end
return
end
--程序分析
/*
1.用上溯法,不断上溯即可.
2.循环分析:
若topic表如下:
id parentId
1 0
2 1
3 1
4 3
5 3
6 0
那么,执行本函数:
select * from fun_oaBBS_typeTree_GetChildrens(5)
一.初值
@curId=5
二.第一次循环:
选取@curId=5的父节点,3插入表变量
@pid=3
@nodes.tid
3
@curId=3
三.第三次循环:
选取@curId3的父节点,1插入表变量
@pid=1
@nodes.tid
3
1
@curId=0
四.循环结束,退出.
*/
--table:oaBBS.Type
--function:获取类型树中指定节点的所有父节点,以及本身
--author:winlin
--date:2006-10-24
ALTER function dbo.fun_oaBBS_typeTree_GetAllParentsAndSelf
(
@nodeId int
)
--返回指定节点的所有子节点.
returns @nodes TABLE (tid int)
AS
begin
--设定初值
insert into @nodes(tid)values(@nodeId)
--循环选取指定节点的子节点
insert into @nodes(tid)
select * from fun_oaBBS_typeTree_GetAllParents(@nodeId)
return
end
--table:oaBBS.Type
--function:获取类型树中指定节点的一级子节点.
--author:winlin
--date:2006-10-24
ALTER function dbo.fun_oaBBS_typeTree_GetChildrens
(
@nodeId int
)
--返回指定节点的所有子节点.
returns @nodes TABLE (tid int)
AS
begin
insert into @nodes(tid)
select topicId from oaBBS_Topic where parentId=@nodeId
return
end
--table:oaBBS.Type
--function:获取类型树中指定节点的一级子节点,以及本身
--author:winlin
--date:2006-10-24
ALTER function dbo.fun_oaBBS_typeTree_GetChildrensAndSelf
(
@nodeId int
)
--返回指定节点的所有子节点.
returns @nodes TABLE (tid int)
AS
begin
--self
insert into @nodes(tid)values(@nodeId)
--childrens
insert into @nodes(tid)
select * from fun_oaBBS_typeTree_GetChildrens(@nodeId)
return
end
--table:oaBBS.Type
--function:获取类型树中指定节点的一级子节点.
--author:winlin
--date:2006-10-24
ALTER function dbo.fun_oaBBS_typeTree_GetParents
(
@nodeId int
)
--返回指定节点的所有子节点.
returns @nodes TABLE (tid int)
AS
begin
insert into @nodes(tid)
select parentId from oaBBS_Topic where topicId=@nodeId
return
end
--table:oaBBS.Type
--function:获取类型树中指定节点的一级子节点,以及本身
--author:winlin
--date:2006-10-24
ALTER function dbo.fun_oaBBS_typeTree_GetParentsAndSelf
(
@nodeId int
)
--返回指定节点的所有子节点.
returns @nodes TABLE (tid int)
AS
begin
--self
insert into @nodes(tid)values(@nodeId)
--childrens
insert into @nodes(tid)
select * from fun_oaBBS_typeTree_GetParents(@nodeId)
return
end








