二叉树的数据库存储

不若人生一场醉 2007-06-12 03:35:21
应求建立一个SQLServer数据表存储二叉树,表结构应该有2种
1、节点编号,父节点编号,是左孩子还是右孩子,节点的数值域,节点的创建日期
2、节点编号,父节点编号,左孩子编号,右孩子编号,节点的数值域,节点的创建日期

需要的功能是,任意给定一个节点编号,遍历他的左(或者右)子树,求得所有左(或者右)子树节点的数值域的和,并且以层序遍历输出左(或者右)子树的一张数据表。
请教一个最优化的查询,效率一定要高,因为这是个asp.net的程序,同时可能有上千人并发访问。上面那2个表的结构用哪个效率更高一些?或者可能还有其他的设计方法?
...全文
707 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不得不服,厉害
hongqi162 2007-06-12
  • 打赏
  • 举报
回复
ref:http://topic.csdn.net/t/20041228/15/3682736.html

--树形数据查询示例
--作者: 邹建

--示例数据
create table [tb]([id] int identity(1,1),[pid] int,name varchar(20))
insert [tb] select 0,'中国'
union all select 0,'美国'
union all select 0,'加拿大'
union all select 1,'北京'
union all select 1,'上海'
union all select 1,'江苏'
union all select 6,'苏州'
union all select 7,'常熟'
union all select 6,'南京'
union all select 6,'无锡'
union all select 2,'纽约'
union all select 2,'旧金山'
go

--查询指定id的所有子
create function f_cid(
@id int
)returns @re table([id] int,[level] int)
as
begin
declare @l int
set @l=0
insert @re select @id,@l
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.[id],@l
from [tb] a,@re b
where a.[pid]=b.[id] and b.[level]=@l-1
end
/*--如果只显示最明细的子(下面没有子),则加上这个删除
delete a from @re a
where exists(
select 1 from [tb] where [pid]=a.[id])
--*/
return
end
go

--调用(查询所有的子)
select a.*,层次=b.[level] from [tb] a,f_cid(2)b where a.[id]=b.[id]
go

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧