SQL获取父级的所有子级,并将子级的值添加到父级

SQL获取父级的所有子级,并将子级的值添加到父级,sql,oracle,Sql,Oracle,假设我有一张这样的桌子 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 Par

假设我有一张这样的桌子

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”父级,其父级值为“Null”。我对SQL非常陌生,因此任何形式的帮助都将不胜感激。如果有帮助的话,我正在使用Oracle 11

是的,您可以使用
connectby\u ROOT
操作符进行连接

基本上,从每一行开始,总结每个根的子项,然后按根分组。像这样:

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

非常感谢你,马修。这正是我想要的。关于学习PL/SQL有什么建议吗?我以前没有任何使用数据库的经验,有时会变得非常混乱。我的答案实际上是Oracle SQL,而不是PL/SQL。对不起,没有真正的小费。我发现Oracle的数据库文档非常好。阅读docs.oracle.com上提供的概念指南。