用于BOM扩展数量的Oracle SQL

时间:2015-02-18 05:25:26

标签: sql oracle hierarchical-data

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

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

使用Oracle的分层查询功能,我成功​​地编写了一个查询,该查询会爆炸给定项目的所有子项目,但我可以使用一些帮助来尝试计算扩展数量。

SQL小提示示例模式和分层查询: http://sqlfiddle.com/#!4/5217c/1

这是我的源表:

+------------+-----------+----------+
| 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 |
+------------+-----------+----------+

我想要的输出如下;然而,多重'提供字段以显示如何找到扩展数量并且不是必需的:

+------------+-----------+-----+----------+--------+--------------------+
| 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 |
+------------+-----------+-----+----------+--------+--------------------+

感谢任何帮助

1 个答案:

答案 0 :(得分:1)

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

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;