数据库中网状结构的表示?

yzx110 2004-07-29 03:00:22
本来是一个树型结构,但是现在发展成一个节点的父节点可以是除了自己子节点(所有的后代节点)之外的所有节点,并且可以有多个.

叶子节点与非叶子节点不是同一个东西(就是需要分开保存),现在需要指定一个非叶子节点,然后能在预先知道的次数(最好不超过2次)之内查询出从属这个非叶子节点的所有叶子节点.

这个问题搞的我头大,不知大家有什么看法??
...全文
354 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yzx110 2004-07-29
  • 打赏
  • 举报
回复
如果按照上面的表结构的话确实不能2次内完成,现在就是想换一种结构去存储.

但是在新的结构下 非叶子节点 的合并和转移的复杂度不会无穷的增大.

当然,我也是想听听大家的意见,也许我的这种想法根本就是无解的!
zjcxc 2004-07-29
  • 打赏
  • 举报
回复
无限分级能在2次查询中查出? 没有听说过.
yzx110 2004-07-29
  • 打赏
  • 举报
回复
你这个能完成功能,但好象查询的次数有点多,查询最好能在2次左右完成
zjcxc 2004-07-29
  • 打赏
  • 举报
回复
不知道是否这个意思?
zjcxc 2004-07-29
  • 打赏
  • 举报
回复
--示例

--测试数据
create table t1(row int,childid varchar(10),parentid varchar(10))
insert t1 select 1,'a','b'
union all select 2,'a','c'
union all select 3,'d','a'
union all select 4,'d','b'
union all select 5,'c','b'
union all select 6,'e','d'
union all select 7,'f','e'

create table t2(row int,leafid varchar(10),parentid varchar(10))
insert t2 select 1,'x1','e'
union all select 2,'x2','e'
union all select 3,'x1','f'
union all select 4,'x3','f'
go

--查询函数
create function f_id(
@id varchar(10) --要查询的非叶子节点
)returns @re table(id varchar(10),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.childid,@l
from t1 a,@re b
where a.parentid=b.id and b.level=@l-1
end
return
end
go

--调用函数实现查询
select a.*,b.*
from f_id('a') ab
join t1 a on a.childid=ab.id
left join t2 b on b.parentid=ab.id --如果只显示匹配的,用join
go

--删除测试
drop table t1,t2
drop function f_id

/*--测试结果

row childid parentid row leafid parentid
----------- ---------- ---------- ----------- ---------- ----------
1 a b NULL NULL NULL
2 a c NULL NULL NULL
3 d a NULL NULL NULL
4 d b NULL NULL NULL
6 e d 1 x1 e
6 e d 2 x2 e
7 f e 3 x1 f
7 f e 4 x3 f

(所影响的行数为 8 行)
--*/
yzx110 2004-07-29
  • 打赏
  • 举报
回复
数据库中的结构不一定按照我说的那样搞,能解决问题就行了.
yzx110 2004-07-29
  • 打赏
  • 举报
回复
实际上结构是这样的

t1:非叶子接点的关系
row childid parentid
1. a b
2. a c
3. d a
4. d b
5. c b
6. e d
7. f e
这种关系是网状的,但是这个网没有回路(就是没有循环引用),而这个网状结构中的任何一条路径的长度是不定的(可能很长).

t2:叶子节点和非叶子节点关系
row leafid parentid
1. x1 e
2. x2 e
3. x1 f
4. x3 f
叶子节点与非叶子节点的关系也是网状的,但是这里只有两级的关系,也就是一个多对多关系.

我现在随便指定一个非叶子节点(a)就能根据t1和t2中的关系查出属于a的所有叶子节点(x),
他们的关系只要满足x是a的后代(不考虑是多少级后代), 但是这个查询必须在有限的几次(就是无论网状结构怎么变,都能够事先确定查询次数)内查询出结果.

zheninchangjiang 2004-07-29
  • 打赏
  • 举报
回复
看错了,没看见一段话,这个可以用一个函数来做:
假设表结构为:id varchar(10),parentid varchar(10) (编号,父级编号)
create function getchildren(@id varchar(10))
returns @r table(id varchar(10),level int)
as
begin
declare @i int
set @i=1
insert into @r select id,@i from [table] where parentid=@id
while @@rowcount>0
begin
set @i=@i+1
insert into @r select id,@i from [table] a join @r b on a.parentid=b.id and b.level=@i-1
end
return
end
zheninchangjiang 2004-07-29
  • 打赏
  • 举报
回复
会不会有循环呀:
如a->b
b->c
c->a 这也是满足你要求的
zjmym 2004-07-29
  • 打赏
  • 举报
回复
不清楚,顶一下

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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