我目前正在为一些项目构建物料清单,但遇到了问题。
我有一个包含以下各列的源表:
自然会有其他列,但是为了简单起见...
该组件当然也可以是装配体。
以下查询将产生零件及其子组件的我的层次视图
SELECT
Part,
Component,
qty
FROM
sourceTable
CONNECT BY
PRIOR Component = Part
START WITH
Part = '<Part number here>'
尽管有一个警告。源表还包含未消耗的项目(替代项目等),在这种情况下,qty列设置为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列上使用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
答案 0 :(得分:1)
您找到了一个解决方案,但是有一个替代方法,不需要函数,递归查询:
with t(part, component, qty, qty_per_main_assembly) as (
select part, component, qty, qty
from sourcetable
where part = '<Part number here>'
union all
select s.part, s.component, s.qty, t.qty_per_main_assembly * s.qty
from t join sourcetable s on t.component = s.part)
select * from t