通过sql生成树型结构

create   table   tb(id   int,name   varchar(10),parentid   int)   
  
insert   tb   select   1,'aaaa'         ,0   
  
union   all   select   2,'bbbb'         ,0   
  
union   all   select   3,'cccc'         ,0   
  
union   all   select   4,'aaaa-1'     ,1   
  
union   all   select   5,'aaaa-2'     ,1   
  
union   all   select   6,'bbbb-1'     ,2   
  
union   all   select   7,'cccc-1'     ,3   
  
union   all   select   8,'cccc-2'     ,3   
  
union   all   select   9,'aaaa-1-1',4   
  
union   all   select   10,'cccc-2-1',8   
  
union   all   select   11,'cccc-2-2',8   
  
union   all   select   12,'aaaa-1-2',4   
  
go   
    
  
--创建处理的函数(对原函数做了修改,增加了前缀)   
  --处理了最大值id的问题。   
  alter   function   f_id()   
  
returns   @re   table(id   int,parentid   int,level   int,sid   varchar(8000),pre1   varchar(2),pre2   varchar(2))   
  
as   
  
begin   
          
declare   @l   int   
          
set   @l=0   
          
insert   @re   select   id,parentid,@l,right(10000+id,4),'',''   
          
from   tb   where   parentid=0   
          
while   @@rowcount>0   
          
begin   
                  
set   @l=@l+1   
                  
insert   @re   select   a.id,a.parentid,@l,b.sid+','+right(10000+a.id,4),'',''  
                  
from   tb   a,@re   b   
                  
where   a.parentid=b.id   and   b.level=@l-1   
          
end   


          
update   a   
  
set   pre2=   case   when   a.level>1   then   
  
case   id   when   (select   convert(int,right(max(sid),4))   from   @re   where   parentid=a.parentid   and   level=a.level)   then   ''   else   ''   end   
              
else   
  
case   id   when   (select   convert(int,right(max(sid),4))   from   @re   where   level=a.level)   then   ''   else   ''   end   
        
end   
  
from   @re   a   
  
where   a.level>0   


   
update   a   
   
set   pre1=    case  when   parentid=(select   convert(int,right(max(sid),4))   from   @re   where   level=a.level-1)       

then '' else '' end   
  
from   @re   a   
  
where   a.level>1   
    
          
return   
  
end   
  








  
  
select   [带缩进的name]=case   when   b.[level]=0   then   a.name   
  
when b.[level]=1 then pre2+replicate('-',4)+a.name   
  
else   b.pre1+replicate('',(b.level-1)*4)+b.pre2+replicate('-',4)+a.name   
  
end,a.name,a.id   
  
from   tb   a,f_id()   b   
  
where   a.id=b.id   
  
order   by   b.sid   
  
/*   
  结果   
  带缩进的name name id   
  ----------------------------------------   
  aaaa aaaa 1   
  ├----aaaa-1 aaaa-1 4   
  │         ├----aaaa-1-1 aaaa-1-1 9   
  │         └----aaaa-1-2 aaaa-1-2 12   
  ├----aaaa-2 aaaa-2 5   
  bbbb bbbb 2   
  ├----bbbb-1 bbbb-1 6   
  cccc cccc 3   
  ├----cccc-1 cccc-1 7   
  └----cccc-2 cccc-2 8   
            ├----cccc-2-1 cccc-2-1 10   
            └----cccc-2-2 cccc-2-2 11   
    
  
*/
   
  






--删除测试   
    
    
  
drop   table   tb   
  
drop   function   f_id   
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值