日期:2014-05-18  浏览次数:20501 次

树形查询 求解
--左连接根据本级中的父级ID,连接上一级中的部门ID,获取到层级上级关系
select A.FParentID,F.FLevel,F.FChinaName,E.FLevel,E.FChinaName,D.FLevel,D.FChinaName,
C.FLevel,C.FChinaName,B.FLevel,B.FChinaName,A.FLevel,A.FChinaName from
left outer join Department A on Y.FDepartmentID=A.FDepartmentID
left outer join Department B on (A.FParentID=B.FDepartmentID)
left outer join Department C on B.FParentID=C.FDepartmentID
left outer join Department D on C.FParentID=D.FDepartmentID
left outer join Department E on D.FParentID=E.FDepartmentID
left outer join Department F on E.FParentID=F.FDepartmentID
left outer join Department G on F.FParentID=G.FDepartmentID
--以上语句可以获取到本级以上所有上级层级关系,由于数据有可能不完整,所以会出现错位,哪位高手办法解决

Department(表) 
--上面语句会找到最小值,然后一级一级往上找。层级范围(7-1,7级最小)
数据完整时
f1 n1 f2 n2 f3 n3 f4 n4 f5 n5 f6 n6 f7 n7(列)
f1 n1 f2 n2 f3 n3 f4 n4 f5 n5 f6 n6 f7 n7(数据)

数据不完整时就会出现错位如:(00 代表NULL)
f1 n1 f2 n2 f3 n3 f4 n4 f5 n5 f6 n6 f7 n7(列)
00 00 f1 n1 f2 n2 f3 n3 f4 n4 f5 n5 f6 n6(数据)
------------------------
f1 n1 f2 n2 f3 n3 f4 n4 f5 n5 f6 n6 f7 n7(列)
00 00 00 00 f1 n1 f2 n2 f3 n3 f6 n6 f7 n7(数据)

我需要把层级和层级名与列名固定好,不会出现错位,求解

------解决方案--------------------
给你一个 树形结构函数 案例
SQL code
就用树型表,可到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 code
/*
标题: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 行受影响)
*/