T-SQL中的递归聚合

时间:2017-05-01 09:57:29

标签: sql sql-server tsql

我正在使用的模式的简化版本如下所示:

节点:

Id Name   ParentId
0  Parent NULL
1  Child1 0
2  Child2 0

属性:

Id NodeId Value
0  1      1
1  1      2

因此,节点可以有许多节点作为子节点,节点也可以有许多属性。

我想创建一个视图,将Node的Id映射到其所有属性的MAX值及其所有子节点的属性。因此,对于上面的示例数据,视图应包含:

Id Value
0  2
1  2
2  NULL

我用CTE尝试过各种各样的东西,但我无法让它发挥作用。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

尝试一下:

;with nodeAttributes as (
    select n.Id, n.Name, n.ParentId, a.Value
    from Nodes n
    left outer join Attributes a on n.Id = a.NodeId
),
cte as
(
    select n.Id, n.Name, n.Id RootId, n.ParentId, n.Value
    from nodeAttributes n

    union all

    select n.Id, n.Name, c.RootId, n.ParentId, n.Value
    from nodeAttributes n
    join cte c on c.Id = n.ParentId
)

select n.Id,  x.maxValue
from Nodes n
join (select RootId, max(Value) maxValue
      from cte
      group by RootId) x on x.RootId = n.Id