利用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、付费专栏及课程。

余额充值