首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请教这样的表,如何查询出树结构?一定给分,分数都给了~

2012-01-13 
请问这样的表,怎么查询出树结构?在线等,一定给分,分数都给了~~表atb_aautoid(是自动增长列)pid(是节点的父

请问这样的表,怎么查询出树结构?在线等,一定给分,分数都给了~~
表a
tb_a
autoid(是自动增长列)
pid(是节点的父节点编号)
level(是节点的级别)
autoid                     pid                     level
-------------------
    1                             0                           1
    2                             1                           2
    3                             1                           2
    4                             0                           1
    5                             4                           1
    6                             4                           1
    7                             2                           3
 8                             1                           2

我想查询得到的结果:


autoid                     pid                     level
-------------------
    1                             0                           1
    2                             1                           2
 7                             2                           3
    3                             1                           2
 8                             1                           2
    4                             0                           1
    5                             4                           1


    6                             4                           1

因为现在在做一个模块,就是用户文件柜.模块大概的需求就是要求支持无限级的目录,最后在页面上要以树的形式展示出来.
我的基本思路就是利用sql语句,查询出上面的那样树结构,最后将列表读出,在内存中进行操作,最后展现在页面上,只要能查询出上面那样的结构,内存中操作我可以搞定,希望高人进,帮忙查询出以上结构.一定给分
或者有什么更好的方法设计表的解决方案也能指点下


[解决办法]
--生成测试数据
create table t1(id int,pid int,level int)
insert into t1 select 1,0,1
insert into t1 select 2,1,2
insert into t1 select 3,1,2
insert into t1 select 4,0,1
insert into t1 select 5,4,1
insert into t1 select 6,4,1
insert into t1 select 7,2,3
insert into t1 select 8,1,2
go

--创建用户定义函数
create function f_getNum(@id int)
returns varchar(4000)
as
begin
declare @ret varchar(4000),@pid int
set @ret = right( '0000 '+rtrim(@id),4)
while exists(select 1 from t1 where id=@id and pid!=0)
begin
select @pid=pid from t1 where id=@id and pid!=0
set @id = @pid
set @ret = right( '0000 '+rtrim(@id),4)+@ret
end
return @ret
end
go


--执行查询
select
*
from
t1
order by
dbo.f_getNum(id)
go

--输出结果:
/*
id pid level
----------- ----------- -----------
1 0 1
2 1 2
7 2 3
3 1 2
8 1 2
4 0 1
5 4 1
6 4 1
*/

--删除测试数据
drop function f_getNum
drop table t1

热点排行