使用T-SQL生成树形目录(引用)
2010-03-03 01:20
337 查看
使用T-SQL生成树形目录(引用) 收藏
--创建测试数据表.
create table tb(id int,name varchar(10),parentid int)
insert tb select 1,'aaaa' ,0
union all select 2,'bbbb' ,0
union all select 3,'cccc' ,0
union all select 4,'aaaa-1' ,1
union all select 5,'aaaa-2' ,1
union all select 6,'bbbb-1' ,2
union all select 7,'cccc-1' ,3
union all select 8,'cccc-2' ,3
union all select 9,'aaaa-1-1',4
union all select 10,'cccc-2-1',8
union all select 11,'cccc-2-2',8
union all select 12,'aaaa-1-2',4
go
--创建表值函数(对原函数做了修改,增加了前缀)
alter function dbo. f_id()
returns @re table(id int,parentid int,level int,sid varchar(8000),pre1 varchar(2),pre2 varchar(2))
as
begin
declare @l int
set @l=0
insert @re select id,parentid,@l,right(10000+id,4),'',''
from tb where parentid=0
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.id,a.parentid,@l,b.sid+','+right(10000+a.id,4),'',''
from tb a,@re b
where a.parentid=b.id and b.level=@l-1
end
update a set pre2=
case
when a.level>1 then case id when (select convert(int,right(max(sid),4)) from @re where parentid=a.parentid and level=a.level) then '└' else '├' end
else case id when (select convert(int,right(max(sid),4)) from @re where level=a.level) then '└' else '├' end
END from @re a where a.level>0
update a set pre1=
CASE
when parentid=(select convert(int,right(max(sid),4)) from @re where level=a.level-1) then '' else '│'
END from @re a where a.level>1
RETURN
END
--返回结果集.
select [带缩进的name]=case when b.[level]=0 then a.name
when b.[level]=1 then pre2+replicate('-',4)+a.name
else b.pre1+replicate('',(b.level-1)*4)+b.pre2+replicate('-',4)+a.name
end,a.name,a.id
from tb a,f_id() b where a.id=b.id order by b.sid
/**//*结果:
带缩进的name name id
-------------------- ---------- -----------
aaaa aaaa 1
├----aaaa-1 aaaa-1 4
│├----aaaa-1-1 aaaa-1-1 9
│└----aaaa-1-2 aaaa-1-2 12
├----aaaa-2 aaaa-2 5
bbbb bbbb 2
├----bbbb-1 bbbb-1 6
cccc cccc 3
├----cccc-1 cccc-1 7
└----cccc-2 cccc-2 8
├----cccc-2-1 cccc-2-1 10
└----cccc-2-2 cccc-2-2 11
*/
引用资源:http://topic.csdn.net/t/20040904/18/3340610.html
http://www.cnblogs.com/drc/archive/2005/11/04/269062.html
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhou__zhou/archive/2007/11/07/1871890.aspx
--创建测试数据表.
create table tb(id int,name varchar(10),parentid int)
insert tb select 1,'aaaa' ,0
union all select 2,'bbbb' ,0
union all select 3,'cccc' ,0
union all select 4,'aaaa-1' ,1
union all select 5,'aaaa-2' ,1
union all select 6,'bbbb-1' ,2
union all select 7,'cccc-1' ,3
union all select 8,'cccc-2' ,3
union all select 9,'aaaa-1-1',4
union all select 10,'cccc-2-1',8
union all select 11,'cccc-2-2',8
union all select 12,'aaaa-1-2',4
go
--创建表值函数(对原函数做了修改,增加了前缀)
alter function dbo. f_id()
returns @re table(id int,parentid int,level int,sid varchar(8000),pre1 varchar(2),pre2 varchar(2))
as
begin
declare @l int
set @l=0
insert @re select id,parentid,@l,right(10000+id,4),'',''
from tb where parentid=0
while @@rowcount>0
begin
set @l=@l+1
insert @re select a.id,a.parentid,@l,b.sid+','+right(10000+a.id,4),'',''
from tb a,@re b
where a.parentid=b.id and b.level=@l-1
end
update a set pre2=
case
when a.level>1 then case id when (select convert(int,right(max(sid),4)) from @re where parentid=a.parentid and level=a.level) then '└' else '├' end
else case id when (select convert(int,right(max(sid),4)) from @re where level=a.level) then '└' else '├' end
END from @re a where a.level>0
update a set pre1=
CASE
when parentid=(select convert(int,right(max(sid),4)) from @re where level=a.level-1) then '' else '│'
END from @re a where a.level>1
RETURN
END
--返回结果集.
select [带缩进的name]=case when b.[level]=0 then a.name
when b.[level]=1 then pre2+replicate('-',4)+a.name
else b.pre1+replicate('',(b.level-1)*4)+b.pre2+replicate('-',4)+a.name
end,a.name,a.id
from tb a,f_id() b where a.id=b.id order by b.sid
/**//*结果:
带缩进的name name id
-------------------- ---------- -----------
aaaa aaaa 1
├----aaaa-1 aaaa-1 4
│├----aaaa-1-1 aaaa-1-1 9
│└----aaaa-1-2 aaaa-1-2 12
├----aaaa-2 aaaa-2 5
bbbb bbbb 2
├----bbbb-1 bbbb-1 6
cccc cccc 3
├----cccc-1 cccc-1 7
└----cccc-2 cccc-2 8
├----cccc-2-1 cccc-2-1 10
└----cccc-2-2 cccc-2-2 11
*/
引用资源:http://topic.csdn.net/t/20040904/18/3340610.html
http://www.cnblogs.com/drc/archive/2005/11/04/269062.html
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhou__zhou/archive/2007/11/07/1871890.aspx
相关文章推荐
- 使用SQL语句生成站点导航树形结构的实例
- 配合Ajaxpro读取无限父子关系部门使用javascript生成的树形目录
- 使用Excel批量生成SQL脚本(小技巧)
- [数据库使用技巧]动态生成sql语句_网络大本营
- PowerDesigner使用教程--PD生成SQL
- RailsCasts中文版,#15 Fun with Find Conditions 使用hash为查询条件以便生成正确语法的SQL查询
- ASP.NET基础教程-使用CommandBuilder对象自动生成SQL语句对数据进行批量更新
- sql_trace生成及使用tkprof查看trace file
- MyBatis学习3---使用SqlBuilder生成SQL语句
- windows下使用tree生成目录树
- Jboss中使用Log4J输出Hibernate所生成的SQL中的参数值
- 即使用ADO.NET,也要轻量级动态生成更新SQL
- CMD命令工具--Windows下使用tree命令生成目录
- SQL Navigator 5 使用技巧——将表中数据,生成insert命令
- VIM树形目录插件-NERDTree的安装与使用
- 使用 generator 自动生成代码,为什么在 mac 下不能生成到 src 目录下
- 使用DBMS_SPM包进行SQL基线的生成和更新
- 关于EasyUI使用tree方法生成树形结构加载两次的问题
- oracle使用sql脚本生成csv文件案例学习
- MyBatis学习-使用SqlBuilder生成SQL语句