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

树形表替换成横向表
树形表如下
ID   Name                 FatherID   Depth
1   作业区             NULL           0  
2   可控             1             1      
3   维护性措施       2             2
4   不可控             1             1
5   战略性措施       4             2
6   电力             NULL           0
7   不可控             6             1
8   停产井             NULL           0

我现在想把它变成另外一个表
IDa       Namea         IDb           Nameb           IDc           Namec
1           作业区       2               可控             3               维护性措施
1           作业区       2               不可控         3               战略性措施
6           电力           7               不可控
8           停产井

如何去做?其中ID和Name后面的abc分别代表了Depth的深度,0   1   2
希望各位高手研讨这个问题,并给出具体的SQL语句方案


------解决方案--------------------
深度不定只能用动态SQL了
create table tb(ID int,Name varchar(10),FatherID int,Depth int)
insert tb select 1, '作业区 ',NULL,0
union all select 2, '可控 ',1,1
union all select 3, '维护性措施 ',2,2
union all select 4, '不可控 ',1,1
union all select 5, '战略性措施 ',4,2
union all select 6, '电力 ',NULL,0
union all select 7, '不可控 ',6,1
union all select 8, '停产井 ',NULL,0

declare @field varchar(8000),@from varchar(8000)
select @field= ' ',@from= ' '
select @field=@field+ ',t '+convert(varchar,depth+1)+ '.id ID '+convert(varchar,depth+1)
+ ',t '+convert(varchar,depth+1)+ '.name Name '+convert(varchar,depth+1),
@from=@from+case depth when 0 then ' from tb t1 ' else ' left join tb t '
+convert(varchar,depth+1)+ ' on t '+convert(varchar,depth+1)+ '.fatherid=t '
+convert(varchar,depth)+ '.id ' end
from tb group by depth
select @field= 'select '+substring(@field,2,len(@field)-1),@from=@from+ ' where t1.depth=0 '
exec(@field+@from)

drop table tb
--结果
ID1 Name1 ID2 Name2 ID3 Name3
----------- ---------- ----------- ---------- ----------- ----------
1 作业区 2 可控 3 维护性措施
1 作业区 4 不可控 5 战略性措施
6 电力 7 不可控 NULL NULL
8 停产井 NULL NULL NULL NULL