日期:2014-05-18 浏览次数:20528 次
就用树型表,可到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 行受影响) */