利用SQL SERVER 2005 中的CTE 实现树的递归

原贴:

http://community.csdn.net/Expert/topic/4619/4619663.xml?temp=.9272577

有如下的数据,parentid表示父节点id,totalchilren表示该节点有几个子节点,total表示数量
id filecode parentid totalchildren total
1  ws112           0       3         0
2  01              1       1         2
3  02              1       1         2
4  03              1       1         2
5  0101            2       0         3
6  0201            3       0         3
7  0301            4       0         3
我想输入ws112,得到如下的结果:
0101  6(2*3)
0201  6(2*3)
0301  6(2*3)
即不管01、02、03这些节点,直接得到ws112最低级的节点情况,请各位大侠帮忙了。

--测试环境

create table A
(
   id int,
   filecode varchar(10),
   parentid int,
   totalchildren int,
   total int
)

insert A select 1,'ws112',0,3,0
insert A select 2,'01',1,1,  2
insert A select 3,'02',1,1,  2
insert A select 4,'03',1,1,  2
insert A select 5,'0101',2,0,  3
insert A select 6,'0201',3,0,  3
insert A select 7,'0301',4,0,  3
insert A select 8,'04',1,0,5

--定义CTE(公共表表达式)

DECLARE @FILECODE AS VARCHAR(20)
SET @FILECODE='ws112';
WITH ACTE(ID,FILECODE,PARENTID,TOTALCHILDREN,TOTAL,LVL)
AS
(
 SELECT ID,FILECODE,PARENTID,TOTALCHILDREN,TOTAL,0
 FROM A WHERE FILECODE=@FILECODE
 UNION ALL
 SELECT TA.ID,TA.FILECODE,TA.PARENTID,TA.TOTALCHILDREN,TA.TOTAL,TB.LVL+1
 FROM A TA INNER JOIN ACTE TB
    ON TA.PARENTID=TB.ID
)
SELECT FILECODE,值=TOTAL*LVL FROM ACTE WHERE TOTALCHILDREN=0

--结果
/*

FILECODE   值
---------- -----------
04         5
0301       6
0201       6
0101       6

(4 行受影响)

*/

--删除测试环境

Drop table A

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值