问一个要求效率比较高的语句

smbeng 2005-09-16 11:26:37
表T_Sort(id,left,right)
是一个二叉树结构:
a
b c
d e f g
要得到每个节点下的所有节点列表
a:bdecfg
b:de
c:fg
d:
e:
f:
g:
有没有比较高效的查询语句,
先谢过了
...全文
205 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
churchatp1 2005-09-19
  • 打赏
  • 举报
回复
或者
id pid name
001 null a
002 001 b
003 001 c
004 002 d
005 002 e
。。。。。。
不过这样查询得时候比较麻烦,更新倒是比较简单一些。
churchatp1 2005-09-19
  • 打赏
  • 举报
回复
你也可以换一下编码方式:
1。编号 名称
01 a
0101 b
0102 c
010101 d
010102 e
......
这样一个节点就可以不止2个孩子了,而且查询得时候会比较方便,不好得地方就是你更新得时候也需要更新相关节点得信息。
smbeng 2005-09-19
  • 打赏
  • 举报
回复
呵呵,谢谢大家了.我要结贴了
$扫地僧$ 2005-09-17
  • 打赏
  • 举报
回复
up
smbeng 2005-09-16
  • 打赏
  • 举报
回复
结构会不会不合理
smbeng 2005-09-16
  • 打赏
  • 举报
回复
表结构是这个:
1 a 2 3
2 b 4 5
3 c 6 7
4 d 0 0
5 e 0 0
6 f 0 0
7 g 0 0
smbeng 2005-09-16
  • 打赏
  • 举报
回复
谢谢 libin_ftsafe(子陌红尘)
表结构是这个:
1 a 2 3
2 b 4 5
3 c 6 7
4 d
5 e
6 f
7 g
子陌红尘 2005-09-16
  • 打赏
  • 举报
回复
--生成测试数据
create table BOM(ID VARCHAR(10),PID VARCHAR(10))
insert into BOM select 'a',NULL
insert into BOM select 'b','a'
insert into BOM select 'c','a'
insert into BOM select 'd','b'
insert into BOM select 'e','b'
insert into BOM select 'f','c'
insert into BOM select 'g','c'
go

--创建用户定义函数
create function f_getChild(@ID VARCHAR(10))
returns varchar(8000)
as
begin
declare @i int,@ret varchar(8000)
declare @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
set @i = 1
insert into @t select ID,PID,@i from BOM where PID = @ID

while @@rowcount<>0
begin
set @i = @i + 1

insert into @t
select
a.ID,a.PID,@i
from
BOM a,@t b
where
a.PID=b.ID and b.Level = @i-1
end

select @ret = isnull(@ret,'')+ID from @t

return @ret
end
go

--执行查询
select ID,isnull(dbo.f_getChild(ID),'') from BOM group by ID
go

--输出结果
/*
a bcdefg
b de
c fg
d
e
f
g
*/

--删除测试数据
drop function f_getChild
drop table BOM
子陌红尘 2005-09-16
  • 打赏
  • 举报
回复
--生成测试数据


create table BOM(ID VARCHAR(10),PID VARCHAR(10))

truncate table BOM
insert into BOM select 'a',NULL
insert into BOM select 'b','a'
insert into BOM select 'c','a'
insert into BOM select 'd','b'
insert into BOM select 'e','b'
insert into BOM select 'f','c'
insert into BOM select 'g','c'
go

--创建用户定义函数
create function f_getChild(@ID VARCHAR(10))
returns varchar(8000)
as
begin
declare @i int,@ret varchar(8000)
declare @t table(ID VARCHAR(10),PID VARCHAR(10),Level INT)
set @i = 1
insert into @t select ID,PID,@i from BOM where PID = @ID

while @@rowcount<>0
begin
set @i = @i + 1

insert into @t
select
a.ID,a.PID,@i
from
BOM a,@t b
where
a.PID=b.ID and b.Level = @i-1
end

select @ret = isnull(@ret,'')+ID from @t

return @ret
end
go

--执行查询
select ID,dbo.f_getChild(ID) from BOM group by ID


drop function f_getChild
drop table BOM

27,580

社区成员

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

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