希望构建一个查询以显示多级分层数据的扩展数量。
我有一个物料清单(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 |
+------------+-----------+-----+----------+--------+--------------------+
感谢任何帮助
答案 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;