`
abalone
  • 浏览: 126359 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

基于关系数据库系统链式存储的树型结构数据,求某结点下的子树所有结点算法(t-sql语言实现)

    博客分类:
  • DB
阅读更多
CREATE FUNCTION  f_subtree(@dpcode varchar(9))  /*树型结构数据,求某结点下的的子树所有结点的自定义函数*/
RETURNS  @new table([dpcode] [varchar] (9)  ,     --结点编码
[dpname] [varchar] (20) ,  --结点名称
[dpcode_p] [varchar] (9) --此结点的父结点编码
)  AS 
BEGIN
declare @temp table([dpcode] [varchar] (9)  ,     --结点编码
[dpname] [varchar] (20) ,  --结点名称
[dpcode_p] [varchar] (9)   --此结点的父结点编码
)  --数据临时存放表
declare @t table([dpcode] [varchar] (9)  ,     --结点编码
[dpname] [varchar] (20) ,  --结点名称
[dpcode_p] [varchar] (9)   --此结点的父结点编码
)   --中间临时表
declare @tt table([dpcode] [varchar] (9)  ,     --结点编码
[dpname] [varchar] (20) ,  --结点名称
[dpcode_p] [varchar] (9)   --此结点的父结点编码
)  --中间交换临时表


delete   @temp
delete  @t
delete @tt
delete  @new


insert into @temp select *  from dpet   
  insert into @t  select * from @temp where dpcode_p=@dpcode 
  insert into @new  select * from @t  --结果临时表
  while (exists(select * from @t where dpcode in (select dpcode_p from @temp)))
    --当某层的结点全为叶子时,才停止循环
    begin
      insert into @tt select * from @t --中间交换临时表
      delete @t
      insert into @t select * from @temp where dpcode_p in
        (select dpcode from @tt)
      delete @tt
      insert into @new select * from @t
    end
  insert into @new select * from @temp where dpcode=@dpcode 

return
END

---------------------------------------------------(以下为存储过程实现)

CREATE TABLE dpet (   --树型结构数据的数据存放表结构
[dpcode] [varchar] (9)  ,     --结点编码
[dpname] [varchar] (20) ,  --结点名称
[dpcode_p] [varchar] (9)   --此结点的父结点编码
) ON [PRIMARY]

/*ms sql 2000调试通过,表temp,t,new,tt 结构与表dpet一致*/

CREATE PROCEDURE  desc_dept(@dpcode varchar(9))   AS
--树型结构数据,求某结点下的的子树所有结点
  truncate table temp
  truncate table t
  truncate table tt
  truncate table new
  insert into temp select *  from dpet    --数据临时存放表
  insert into t  select * from temp where dpcode_p=@dpcode  --中间临时表
  insert into new  select * from t  --结果临时表
  while (exists(select * from t where dpcode in (select dpcode_p from temp)))
    --当某层的结点全为叶子时,才停止循环
    begin
      insert into tt select * from t --中间交换临时表
      truncate table t
      insert into t select * from temp where dpcode_p in
        (select dpcode from tt)
      truncate table tt
      insert into new select * from t
    end
  insert into new select * from temp where dpcode=@dpcode
GO
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics