【问题标题】:Accessing ancestors in Oracle hierarchical query (CONNECT BY PRIOR)在 Oracle 分层查询中访问祖先(CONNECT BY PRIOR)
【发布时间】: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


    【解决方案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
    

    dbfiddle example

    【讨论】:

      猜你喜欢
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2013-10-24
      • 2011-04-25
      • 2010-10-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-18
      相关资源
      最近更新 更多