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