【问题标题】:Recursive Queries Using CTE, get from parent使用 CTE 的递归查询,从父级获取
【发布时间】:2013-08-06 04:40:01
【问题描述】:

我有一张桌子

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 的父节点,所以我将使用所有相关节点的 num 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

【问题讨论】:

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


    【解决方案1】:

    怎么样

    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

    【讨论】:

      猜你喜欢
      • 2020-10-05
      • 2013-01-31
      • 2014-08-11
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多