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

[size=medium]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[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值