ID 栏目名字 父级ID
1 走进XXXX 0
2 集团简介 1
6 企业荣誉 1
7 新增荣誉 6
8 荣誉管理 6
9 企业党建 1
12 一级栏目 0
13 一个单篇 12
14 一个单篇 12
15 一个多篇 12
16 新增多篇 15
17 多篇管理 15
18 一个单篇 12
......
......
希望查询后结果: 1-2-6-7-8-9,12-13-14-15-16-17-18,也就是一级栏目ID在首位,子级在后面。-符号链接,,结束。谢谢!!!!!
解决方案 »
- OPENROWSET 用于update时 提示表别名无效!求解!!
- 有请SQL高人下天山 HELP ME!!!!!此题好象比较复杂,顶者有分
- 关于between and查询问题
- sql查询语句高手进!
- NVARCHAR(MAX)可以存储多大空间?
- os系统超级用户密码一改,sql server 就不能启动?
- 这个sql 语句怎么写?
- 在同一服务器下的跨不同数据库中的数据查询
- 在SQL语句中进行字段相除求结果如何处理除数为0(即字段值为0)的情况
- 这样的问题碰到很久了,一直不知道怎么解决,哪位高手指点一下啊
- excel批量导入MSSQL2005 多表关系怎么办,在线等
- 求一个SQL语句的实现,高人指点
/*
标题:查询所有节点及其所有子节点的函数
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2009-04-12
地点:广东深圳
*/--生成测试数据
create table tb(id varchar(10),pid varchar(10))
insert into tb select 'a', null
insert into tb select 'b', 'a'
insert into tb select 'c', 'a'
insert into tb select 'd', 'b'
insert into tb select 'e', 'b'
insert into tb select 'f', 'c'
insert into tb 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 tb where id = @id
while @@rowcount <> 0
begin
set @i = @i + 1
insert into @t select a.id , a.pid , @i from tb a , @t b where a.pid = b.id and b.level = @i - 1
end
select @ret = isnull(@ret , '') + id + ',' from @t
return left(@ret , len(@ret) - 1)
end
go --执行查询
select id , children = isnull(dbo.f_getchild(id) , '') from tb group by id
go --输出结果
/*
id children
---------- -------------
a a,b,c,d,e,f,g
b b,d,e
c c,f,g
d d
e e
f f
g g(所影响的行数为 7 行)*/ --删除测试数据
drop function f_getchild
drop table tb
标题:查询各节点的父路径函数
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-05-12
地点:广东深圳
*//*
原始数据及要求结果如下:
--食品
--水果
--香蕉
--苹果
--蔬菜
--青菜
id pid name
----------- ----------- --------------------
1 0 食品
2 1 水果
3 1 蔬菜
4 2 香蕉
5 2 苹果
6 3 青菜要求得到各节点的父路径即如下结果:
id pid name 路径
--- --- ----- ---------------
1 0 食品 食品
2 1 水果 食品,水果
3 1 蔬菜 食品,蔬菜
4 2 香蕉 食品,水果,香蕉
5 2 苹果 食品,水果,苹果
6 3 青菜 食品,蔬菜,青菜
*/create table tb (id int , pid int , name nvarchar(20))
insert into tb values(1 , 0 , '食品')
insert into tb values(2 , 1 , '水果')
insert into tb values(3 , 1 , '蔬菜')
insert into tb values(4 , 2 , '香蕉')
insert into tb values(5 , 2 , '苹果')
insert into tb values(6 , 3 , '青菜')
go--查询各节点的父路径函数
create function f_pid(@id int) returns varchar(100)
as
begin
declare @re_str as varchar(100)
set @re_str = ''
select @re_str = name from tb where id = @id
while exists (select 1 from tb where id = @id and pid <> 0)
begin
select @id = b.id , @re_str = b.name + ',' + @re_str from tb a , tb b where a.id = @id and a.pid = b.id
end
return @re_str
end
goselect * , dbo.f_pid(id) 路径 from tb order by iddrop table tb
drop function f_pid
insert into tb values(1 , '走进XXXX' , 0 )
insert into tb values(2 , '集团简介' , 1 )
insert into tb values(6 , '企业荣誉' , 1 )
insert into tb values(7 , '新增荣誉' , 6 )
insert into tb values(8 , '荣誉管理' , 6 )
insert into tb values(9 , '企业党建' , 1 )
insert into tb values(12, '一级栏目' , 0)
insert into tb values(13, '一个单篇' , 12)
insert into tb values(14, '一个单篇' , 12)
insert into tb values(15, '一个多篇' , 12)
insert into tb values(16, '新增多篇' , 15)
insert into tb values(17, '多篇管理' , 15)
insert into tb values(18, '一个单篇' , 12)
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 tb where id = @id
while @@rowcount <> 0
begin
set @i = @i + 1
insert into @t select a.id , a.pid , @i from tb a , @t b where a.pid = b.id and b.level = @i - 1
end
select @ret = isnull(@ret , '') + id + '-' from @t
return left(@ret , len(@ret) - 1)
end
go --执行查询
select id , children = isnull(dbo.f_getchild(id) , '') from tb where pid = 0 group by id drop function f_getchild
drop table tb/*
id children
---------- --------------------
1 1-9-2-6-8-7
12 12-13-14-15-18-16-17(所影响的行数为 2 行)
*/