我正在使用的模式的简化版本如下所示:
节点:
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尝试过各种各样的东西,但我无法让它发挥作用。有什么想法吗?
答案 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