日期:2014-05-17 浏览次数:20663 次
IF OBJECT_ID('test') IS NOT NULL
DROP TABLE test
go
CREATE TABLE test (上级节点 VARCHAR(10), 下级节点 VARCHAR(10), 重量 INT )
GO
INSERT INTO test
SELECT 'A','B',NULL
UNION ALL
SELECT 'A','C',NULL
UNION ALL
SELECT 'B','D',NULL
UNION ALL
SELECT 'B','E',5
UNION ALL
SELECT 'C','F',17
UNION ALL
SELECT 'D','G',10
;WITH cte
AS
(
--先找出叶子节点
SELECT 上级节点 , 下级节点 , 重量
FROM test
WHERE 重量 IS NOT NULL
UNION ALL
--找出叶子节点的上级节点及上级节点的上级节点,以此类推
SELECT b.上级节点,b.下级节点,a.重量
FROM cte a INNER JOIN test b ON a.上级节点=b.下级节点
)
SELECT 上级节点 节点, SUM(重量) 重量 FROM cte GROUP BY 上级节点
/*
节点 重量
---------- -----------
A 32
B 15
C 17
D 10
(4 行受影响)
*/