当前位置: 首页 >> 程序设计 >> 数据结构和算法 >> MSSQL树算法实现
 

MSSQL树算法实现

作者:      来源:http://blog.csdn.net/winlin398510617     发表时间:2007-02-02     浏览次数:      字号:    

MSSQL树算法,常用的树的形成.以前看过用游标和递归写的,窃以为SQL用递归是大忌,所以自己写了一个,代码量和清晰度都还行.

下载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

.第一次循环:

选取topic1的所有子节点,23插入表变量

@nodes.tid

1

2

3

.第三次循环:

选取topic@nodes的所有子节点,45入选

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

 

编辑 webmaster

 
 
 
评论更多>>
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •