我有一个包含列id, label, cost, parent_id
的表objective
,我有以下查询
select
b.id,
b.parent_id,
b.label,
b.cost
from objective b
start with b.parent_id is null
connect by
prior b.id=b.parent_id
ORDER SIBLINGS BY b.id
只有叶子(有时是叶子的父节点)具有不为空的列cost
,其它的几乎总是空,是否可以得到每个节点的成本(对正下方的节点的成本求和)。
我知道它可以用join和sum来完成,但我想也许有一个更简单的方法来完成它。如果这是表的内容:
ID PARENT_ID LABEL COST
1 null A 0
2 1 B 1
3 2 C 3
4 1 D 0
5 4 E 3
6 5 F 7
7 4 G 5
结果应该是这样的:
ID PARENT_ID LABEL COST CALCULATED_COST
1 null A 0 15(meaning 0 is a wrong value)
2 1 B 1 3 (meaning 1 is a wrong value)
3 2 C 3 3
4 1 D 0 12
5 4 E 3 7 (meaning 3 is a wrong value)
6 5 F 7 7
7 4 G 5 5
型
1条答案
按热度按时间pftdvrlh1#
只有叶(有时是叶的父)的列成本不为空,其他的几乎总是空
如果规则是“只有一个叶节点或一个叶节点的父节点有非空的
cost
,其他节点总是空”,那么你可以用途:如果规则是“任何行都可以有一个非空的
cost
“,那么您需要在两个方向上解析数据结构:或者使用递归子查询分解子句:
型
fiddle
更新
如果要计算某行及其所有后代的成本总和,则可以用途:
对于样本数据输出:
输出:
| 识别号|母体ID|标签|成本|总计_成本|
| - ------|- ------|- ------|- ------|- ------|
| 1个| * 无效 *| A类|无|十九|
| 第二章|1个|B| 1个|四个|
| 三个|第二章|C级|三个|三个|
| 四个|1个|D级|无|十五|
| 五个|四个|E级|三个|十个|
| 第六章|五个|F级|七|七|
| 七|四个|G级|五个|五个|
fiddle
更新2:
如果只想合计叶子的后代,则:
对于样本数据,它输出:
| 识别号|母体ID|标签|成本|总计_成本|
| - ------|- ------|- ------|- ------|- ------|
| 1个| * 无效 *| A类|无|十五|
| 第二章|1个|B| 1个|三个|
| 三个|第二章|C级|三个|三个|
| 四个|1个|D级|无|十二|
| 五个|四个|E级|三个|七|
| 第六章|五个|F级|七|七|
| 七|四个|G级|五个|五个|
fiddle