原贴:
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