日期:2014-05-17  浏览次数:20504 次

由叶子节点的值反算上边各级节点的值
小弟现在在做一个程序,由于叶子节点有重量,上级节点的值又是其下级节点值的和,不知如何实现。
例如:
上级节点 下级节点 重量
A B
A C
B D
B E 5
C F 17
D G 10
如何通过叶子节点E、F、G的重量求出上级节点A、B、C、D的重量

------解决方案--------------------
SQL code
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 行受影响)
 
 */