日期:2014-05-18 浏览次数:20643 次
就用树型表,可到N级.参考如下:
create table tb(id int, name varchar(10), pid int, px int)
insert into tb values(0 , '栏目分类', 0 , 1)
insert into tb values(1 , '动物' , 0 , 1)
insert into tb values(2 , '视频' , 0 , 2)
insert into tb values(3 , '老虎' , 1 , 1)
insert into tb values(4 , '狮子' , 1 , 2)
insert into tb values(5 , '搞笑' , 2 , 1)
go
--查询指定节点及其所有子节点的函数
CREATE FUNCTION f_Cid(@ID int) RETURNS @t_Level TABLE(ID int,Level int)
AS
BEGIN
DECLARE @Level int
SET @Level=1
INSERT @t_Level SELECT @ID,@Level
WHILE @@ROWCOUNT>0
BEGIN
SET @Level=@Level+1
INSERT @t_Level SELECT a.ID,@Level
FROM tb a,@t_Level b
WHERE a.PID=b.ID
AND b.Level=@Level-1
END
RETURN
END
GO
--调用函数查询id = 1及其所有子节点
SELECT a.* FROM tb a,f_Cid(1) b WHERE a.ID=b.ID
/*
id name pid px
----------- ---------- ----------- -----------
1 动物 0 1
3 老虎 1 1
4 狮子 1 2
(所影响的行数为 3 行)
*/
------解决方案--------------------
如果你是分列显示,可参考如下:
/*
标题:SQL SERVER 2005中树结构数据分列显示
作者:爱新觉罗·毓华(十八年风雨,守得冰山雪莲花开)
时间:2010-10-27
地点:陕西西安
*/
create table tb(id varchar(3) , pid varchar(3) , name nvarchar(10))
insert into tb values('001' , '000' , N'广东省')
insert into tb values('002' , '001' , N'深圳市')
insert into tb values('003' , '002' , N'宝安区')
insert into tb values('004' , '003' , N'龙华镇')
insert into tb values('005' , '004' , N'民治街道')
insert into tb values('011' , '111' , N'江西省')
insert into tb values('012' , '011' , N'南昌市')
insert into tb values('013' , '012' , N'南昌县')
insert into tb values('014' , '013' , N'麻丘镇')
insert into tb values('015' , '014' , N'龙井乡')
go
;with t as(
select pid , id , pid grp , name from tb where pid not in (select id from tb)
union all
select tb.pid , tb.id , t.grp , tb.name name from tb , t where tb.pid = t.id
)
select [1] name1,[2] name2,[3] name3,[4] name4,[5] name5
from (select grp,name,row_number() over (partition by grp order by id) px from t) p
pivot (max(name) for px in ([1],[2],[3],[4],[5])) pvt;
drop table tb
/*
name1 name2 name3 name4 name5
---------- ---------- ---------- ---------- ----------
广东省 深圳市 宝安区 龙华镇 民治街道
江西省 南昌市 南昌县 麻丘镇 龙井乡
(2 行受影响)
*/