假设我有一个这样的表。
ID Parent Value
1 NULL 1000
2 1 1000
3 2 1000
4 2 1000
5 2 1000
6 2 1000
7 2 1000
8 1 1000
9 8 1000
10 8 1000
11 8 1000
我想递归地添加给定id的每个子值。正确的输出是。
ID Parent Value
1 NULL 11000
2 1 6000
3 2 1000
4 2 1000
5 2 1000
6 2 1000
7 2 1000
8 1 4000
9 8 1000
10 8 1000
11 8 1000
只有一个"top"父节点,它的parent值为"Null"。我是非常新的SQL,所以任何类型的帮助将不胜感激。如果有帮助的话,我正在使用Oracle 11。
可以,您可以使用CONNECT_BY_ROOT
运算符。
基本上,"START WITH"每一行,对每个根的子节点求和,然后按根分组。这样的:
with test_data (id, parent, value) as (
SELECT 1, NULL, 1000 FROM DUAL UNION ALL
SELECT 2, 1, 1000 FROM DUAL UNION ALL
SELECT 3, 2, 1000 FROM DUAL UNION ALL
SELECT 4, 2, 1000 FROM DUAL UNION ALL
SELECT 5, 2, 1000 FROM DUAL UNION ALL
SELECT 6, 2, 1000 FROM DUAL UNION ALL
SELECT 7, 2, 1000 FROM DUAL UNION ALL
SELECT 8, 1, 1000 FROM DUAL UNION ALL
SELECT 9, 8, 1000 FROM DUAL UNION ALL
SELECT 10, 8, 1000 FROM DUAL UNION ALL
SELECT 11, 8, 1000 FROM DUAL)
SELECT root_id id, root_parent parent, sum(value) value
FROM (
SELECT connect_by_root(id) root_id, connect_by_root(parent) root_parent, value
FROM test_data td
connect by parent = prior id
-- notice there is no "start with" clause
)
group by root_id, root_parent
order by root_id