在 Oracle 分层查询中访问祖先(CONNECT BY PRIOR)
Accessing ancestors in Oracle hierarchical query (CONNECT BY PRIOR)
我目前正在为几个项目制作物料清单,运行 遇到了问题。
我有一个来源 table 包含以下列:
- 部分
- 组件
- 数量
自然还有其他栏目,不过为了简单起见...
组件当然也可以是组件。
以下查询将生成我的部件及其子组件的层次视图
SELECT
Part,
Component,
qty
FROM
sourceTable
CONNECT BY
PRIOR Component = Part
START WITH
Part = '<Part number here>'
不过有一点需要注意。源 table 还包含未消耗的项目(替代项目等),在这种情况下,数量列设置为 0
所有后续部分都没有设置为 0。
我可以通过访问 PRIOR 元素数量来在子结构上解决这个问题。
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 数量
------------------------编辑---------------- ----------
在谷歌搜索的帮助下弄明白了
通过在数量列上使用 SYS_CONNECT_BY_PATH,我能够构建一个包含数量层次结构的字符串
在此之后,我必须构建一个函数,该函数接受该字符串并将其拆分为各个值,然后将这些值相乘
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;
使用上面的函数,我只需要将它插入到我的 select 查询中
EVAL(SUBSTR( SYS_CONNECT_BY_PATH( TO_CHAR(qty), '*' ) , 2)) AS QTY_PER_MAIN_ASSEMBLY
您找到了解决方案,但还有一个替代方案,不需要函数,递归查询:
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
我目前正在为几个项目制作物料清单,运行 遇到了问题。
我有一个来源 table 包含以下列:
- 部分
- 组件
- 数量
自然还有其他栏目,不过为了简单起见...
组件当然也可以是组件。
以下查询将生成我的部件及其子组件的层次视图
SELECT
Part,
Component,
qty
FROM
sourceTable
CONNECT BY
PRIOR Component = Part
START WITH
Part = '<Part number here>'
不过有一点需要注意。源 table 还包含未消耗的项目(替代项目等),在这种情况下,数量列设置为 0
所有后续部分都没有设置为 0。
我可以通过访问 PRIOR 元素数量来在子结构上解决这个问题。
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 数量
------------------------编辑---------------- ----------
在谷歌搜索的帮助下弄明白了
通过在数量列上使用 SYS_CONNECT_BY_PATH,我能够构建一个包含数量层次结构的字符串
在此之后,我必须构建一个函数,该函数接受该字符串并将其拆分为各个值,然后将这些值相乘
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;
使用上面的函数,我只需要将它插入到我的 select 查询中
EVAL(SUBSTR( SYS_CONNECT_BY_PATH( TO_CHAR(qty), '*' ) , 2)) AS QTY_PER_MAIN_ASSEMBLY
您找到了解决方案,但还有一个替代方案,不需要函数,递归查询:
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