sql server 2005 中的用WITH CTE中实现迭归的的应用

sql server 2000 中要实现迭归需要用函数处理.sql 2005提供了相应的迭归方法.

示例如下:

declare   @t   table ( id  int   identity ( 1 , 1 ),name  varchar ( 10 ),ParentID  varchar ( 10 ))
insert   into   @t   select   ' a ' , ''
union   all   select   ' b ' , ''
union   all   select   ' a1 ' , 1
union   all   select   ' a2 ' , 1
union   all   select   ' b1 ' , 2
union   all   select   ' a11 ' , 3
union   all   select   ' a12 ' , 3
union   all   select   ' b11 ' , 5
union   all   select   ' b12 ' , 5
union   all   select   ' b13 ' , 5
union   all   select   ' a111 ' , 6
union   all   select   ' a112 ' , 6
union   all   select   ' a113 ' , 6
-- 1d=5,6 的情况
DECLARE   @id   AS   varchar ( 200 )
SET   @id = ' 5,6 ' ;
WITH  TCTE(ID,name,ParentID,LVL)
AS

 
SELECT  ID,name,ParentID, 0
 
FROM   @t   WHERE   charindex ( ' , ' + ltrim (id) + ' , ' , ' , ' + @id + ' , ' ) > 0
 
UNION   ALL
 
SELECT  ta.ID,ta.name,ta.ParentID,TB.LVL + 1
 
FROM   @t  TA  INNER   JOIN  TCTE TB
    
ON  TA.ParentID = TB.id
),
T_CTE(ID,name,ParentID,LVL)
AS

 
SELECT  ID,name,ParentID, 0
 
FROM   @t   WHERE   charindex ( ' , ' + ltrim (id) + ' , ' , ' , ' + @id + ' , ' ) > 0
 
UNION   ALL
 
SELECT  ta.ID,ta.name,ta.ParentID,TB.LVL + 1
 
FROM   @t  TA  INNER   JOIN  T_CTE TB
    
ON  TA.id = TB.ParentID
)
SELECT  ID,name,ParentID = case   when  ParentID = 0   then   null   else  ParentID  end  
FROM  TCTE
UNION
SELECT  ID,name,ParentID = case   when  ParentID = 0   then   null   else  ParentID  end   
FROM  T_CTE 


-- 结果
/*
ID          name       ParentID
----------- ---------- ----------
1           a          NULL
2           b          NULL
3           a1         1
5           b1         2
6           a11        3
8           b11        5
9           b12        5
10          b13        5
11          a111       6
12          a112       6
13          a113       6

(11 行受影响)
*/

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值