BOM 扩展数量的 Oracle SQL

Oracle SQL for BOM Extended Quantity

希望构建一个查询来显示来自多级分层数据的扩展数量。

我有一个物料清单 (BOM) table,它定义了组件的关系、它包含的零件以及每个零件的数量。每个零件都可以是子组件,也定义为零件和数量的表达式。在下面的 table 中,Item0 包含一个 Item1 -- Item1 包含两个项目:一个 Item3 和两个 Item6 -- 依此类推。

使用 Oracle 的分层查询功能,我成功​​地编写了一个查询来展开给定项目的所有子项目,但我需要一些帮助来计算扩展数量。

SQL Fiddle 示例架构和分层查询: http://sqlfiddle.com/#!4/5217c/1

这是我的来源table:

+------------+-----------+----------+
| PARENTNODE | CHILDNODE | QUANTITY |
+------------+-----------+----------+
| Item0      | Item1     |        2 |
| Item0      | Item5     |        1 |
| Item0      | Item6     |        2 |
| Item0      | Item7     |        2 |
| Item0      | Item9     |      384 |
| Item1      | Item3     |        1 |
| Item1      | Item6     |        2 |
| Item3      | Item11    |        1 |
| Item3      | Item14    |        1 |
| Item3      | Item15    |        1 |
| Item3      | Item16    |        3 |
| Item3      | Item17    |        1 |
| Item3      | Item18    |        1 |
| Item3      | Item19    |        1 |
| Item3      | Item21    |        1 |
| Item4      | Item20    |        1 |
| Item4      | Item23    |        0 |
| Item4      | Item24    |        1 |
| Item4      | Item8     |        1 |
| Item5      | Item22    |        4 |
| Item5      | Item4     |        4 |
| Item6      | Item10    |        0 |
| Item6      | Item13    |        1 |
| Item6      | Item9     |       32 |
| Item7      | Item12    |        1 |
| Item7      | Item9     |       16 |
+------------+-----------+----------+

我想要的输出如下所示;但是,提供 'multiple' 字段是为了显示扩展数量是如何找到的,这不是必需的:

+------------+-----------+-----+----------+--------+--------------------+
| PARENTNODE | CHILDNODE | Qty | Multiple | ExtQty |        Path        |
+------------+-----------+-----+----------+--------+--------------------+
| Item0      | Item1     |   2 |        1 |      2 | /Item0             |
| Item0      | Item10    |   0 |        2 |      0 | /Item0/Item1/Item6 |
| Item0      | Item10    |   0 |        4 |      0 | /Item0/Item1/Item6 |
| Item0      | Item11    |   1 |        2 |      2 | /Item0/Item1/Item3 |
| Item0      | Item12    |   1 |        2 |      2 | /Item0/Item7       |
| Item0      | Item13    |   1 |        2 |      2 | /Item0/Item1/Item6 |
| Item0      | Item13    |   1 |        4 |      4 | /Item0/Item1/Item6 |
| Item0      | Item14    |   1 |        2 |      2 | /Item0/Item1/Item3 |
| Item0      | Item15    |   1 |        2 |      2 | /Item0/Item1/Item3 |
| Item0      | Item16    |   3 |        2 |      6 | /Item0/Item1/Item3 |
| Item0      | Item17    |   1 |        2 |      2 | /Item0/Item1/Item3 |
| Item0      | Item18    |   1 |        2 |      2 | /Item0/Item1/Item3 |
| Item0      | Item19    |   1 |        2 |      2 | /Item0/Item1/Item3 |
| Item0      | Item20    |   1 |        4 |      4 | /Item0/Item5/Item4 |
| Item0      | Item21    |   1 |        2 |      2 | /Item0/Item1/Item3 |
| Item0      | Item22    |   4 |        1 |      4 | /Item0/Item5       |
| Item0      | Item23    |   0 |        4 |      0 | /Item0/Item5/Item4 |
| Item0      | Item24    |   1 |        4 |      4 | /Item0/Item5/Item4 |
| Item0      | Item3     |   1 |        2 |      2 | /Item0/Item1       |
| Item0      | Item4     |   4 |        1 |      4 | /Item0/Item5       |
| Item0      | Item5     |   1 |        1 |      1 | /Item0             |
| Item0      | Item6     |   2 |        1 |      2 | /Item0/Item1       |
| Item0      | Item6     |   2 |        2 |      4 | /Item0/Item1       |
| Item0      | Item7     |   2 |        1 |      2 | /Item0             |
| Item0      | Item8     |   1 |        4 |      4 | /Item0/Item5/Item4 |
| Item0      | Item9     |  16 |        2 |     32 | /Item0/Item1/Item6 |
| Item0      | Item9     | 384 |        1 |    384 | /Item0/Item1/Item6 |
| Item0      | Item9     |  32 |        2 |     64 | /Item0/Item1/Item6 |
| Item0      | Item9     |  32 |        4 |    128 | /Item0/Item1/Item6 |
+------------+-----------+-----+----------+--------+--------------------+

感谢任何帮助

此递归查询给出了所需的输出:

with r(parentnode, childnode, quantity, eq, pth) as (
  select parentnode, childnode, quantity, quantity eq, '/'||parentnode 
    from exampletable where parentnode='Item0'
  union all
  select e.parentnode, e.childnode, e.quantity, 
      e.quantity * r.eq eq, r.pth||'/'||e.childnode
    from exampletable e, r
    where e.parentnode = r.childnode)
select * from r order by childnode;