递归查询使用CTE,从父级获取

时间:2013-08-06 04:40:01

标签: sql-server recursion hierarchy common-table-expression

我有一张桌子

Node | NoteParent | Num
  A  |     Root   | 10      
  B  |     A      | 20
  C  |     A      | 30
  G  |     B      | 40
  D  |     B      | 50
  E  |     G      | 70
  F  |     C      | 60

我有一个问题,我如何使用CTE来求和节点的数量取决于它与另一个节点的链接。 例如,我有节点B有Num是20,节点B是节点G和节点D的父节点,节点G也是节点E的父节点所以我将使用所有数量的相关节点20(B)+ 40( G)+ 50(D)+ 70(E)= 180

结果将是:

Node | NoteParent |  Num  |  SUM 
  A  |    Root    |  10   |  280
  B  |     A      |  20   |  180   
  C  |     A      |  30   |   90 
  G  |     B      |  40   |  110
  D  |     B      |  50   |   50
  E  |     G      |  70   |   70
  F  |     C      |  60   |   60

1 个答案:

答案 0 :(得分:5)

这样的东西
DECLARE @MyTable TABLE
    ([Node] varchar(1), [NoteParent] varchar(4), [Num] int)
;

INSERT INTO @MyTable
    ([Node], [NoteParent], [Num])
VALUES
    ('A', 'Root', 10),
    ('B', 'A', 20),
    ('C', 'A', 30),
    ('G', 'B', 40),
    ('D', 'B', 50),
    ('E', 'G', 70),
    ('F', 'C', 60)


;WITH Vals AS (
        SELECT  mt.Node TopNode,
                mt.NoteParent TopNoteParent,
                *
        FROM    @MyTable mt
        UNION ALL
        SELECT  v.TopNode,
                v.TopNoteParent,
                m.*
        FROM    @MyTable m  INNER JOIN
                Vals v ON   v.Node = m.NoteParent
)
SELECT  TopNode,
        TopNoteParent,
        SUM(Num) [SUM]
FROM    Vals
GROUP BY    TopNode,
        TopNoteParent
ORDER BY 1

SQL Fiddle DEMO