利用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

你可能感兴趣的:(JOIN,sql,server,测试,table,insert)