【发布时间】:2019-10-07 09:52:42
【问题描述】:
我目前正在为几个项目制定材料清单,但遇到了问题。
我有一个包含以下列的源表:
- 部分
- 组件
- 数量
当然还有其他栏目,不过为了简单起见……
组件当然也可以是组件。
以下查询将产生我对零件及其子组件的分层视图
SELECT
Part,
Component,
qty
FROM
sourceTable
CONNECT BY
PRIOR Component = Part
START WITH
Part = '<Part number here>'
但有一个警告。源表还包含未消耗的项目,(替代项目等)在这种情况下,数量列设置为 0
然而,所有后续部分均未设置为 0。
因此,我可以通过访问 PRIOR 元素 qty 在子结构上解决此问题。
SELECT
Part,
Component,
qty,
PRIOR qty * qty AS QTY_PER_MAIN_ASSEMBLY
FROM
sourceTable
CONNECT BY
PRIOR Component = Part
START WITH
Part = '<Part number here>'
我将如何在子组件或层次结构中的较低级别上进行此操作?
我基本上想知道在这种情况下如何访问n级PRIOR qty
--------------------------- 编辑 ------------------- --------
在谷歌搜索的帮助下弄清楚了
通过在 qty 列上使用 SYS_CONNECT_BY_PATH,我能够构建一个包含 qty 层次结构的字符串
在此之后,我必须构建一个函数,将这个字符串拆分为单独的值,然后将它们相乘
CREATE OR REPLACE FUNCTION eval (expr_in IN VARCHAR2)
RETURN NUMBER
AUTHID CURRENT_USER
DETERMINISTIC
RESULT_CACHE
IS
PRAGMA UDF;
v_res NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT ' || expr_in || ' FROM DUAL' INTO v_res;
RETURN v_res;
END eval;
使用上述函数,我只需将其插入到我的选择查询中
EVAL(SUBSTR( SYS_CONNECT_BY_PATH( TO_CHAR(qty), '*' ) , 2)) AS QTY_PER_MAIN_ASSEMBLY
【问题讨论】:
标签: sql oracle recursion hierarchical connect-by