SQL递归查询数据

Tree表如下:  
    NodeId   ParentId     NodeName  
    0           -1                 一  
    1           0                  二  
    9           1                  三  
    10         9                  四  
    12         10                五  
    18         1                  六  
  已知:Nodeid 能得到 NodeName 的递归连接字符串吗?
  例:    已知            结果  
        NodeId:10       四三二一  
        NodeId:18       六二一  
        NodeId:1         二一

 

解决方法:

 

1、创建表结构。

 程序代码
create   table   Tree(NodeId   int,ParentId   int,NodeName   varchar(4))  
  insert   into   Tree   select   0   ,-1,'一'  
  insert   into   Tree   select   1   ,0   ,'二'  
  insert   into   Tree   select   9   ,1   ,'三'  
  insert   into   Tree   select   10,9   ,'四'  
  insert   into   Tree   select   12,10,'五'  
  insert   into   Tree   select   18,1   ,'六'  
  go


2、构造函数。

 程序代码
  create   function   f_getPath(@NodeId   int)  
  returns   varchar(8000)  
  as  
  begin  
          declare   @ret   varchar(8000),@ParentId   int  
          set   @ret   =   ''  
          select   @ret=@ret+NodeName,@ParentId=ParentId   from   Tree   where   NodeId=@NodeId  
          while   @@rowcount<>0  
          begin  
                  set   @NodeId=@ParentId  
                  select   @ret=@ret+NodeName,@ParentId=ParentId   from   Tree   where   NodeId=@NodeId  
          end  
          return   @ret  
  end  
  go


3、调用函数,并显示结果。

 程序代码
  select   *,path=dbo.f_getPath(NodeId)   from   Tree  
  go

结果如下:
  NodeId    ParentId     NodeName Path  
  0           -1         一          一  
  1           0          二          二一  
  9           1          三          三二一  
  10         9          四          四三二一  
  12         10         五          五四三二一  
  18         1          六          六二一  

4、删除表结构及函数。

 程序代码
  drop   function   f_getPath  
  drop   table   Tree  
  go
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值