【问题标题】:DB2 SQL: Union a recursive query performed on BOM file back to it's root listDB2 SQL:将对 BOM 文件执行的递归查询联合回其根列表
【发布时间】:2021-01-24 00:26:47
【问题描述】:

业务案例:使用单个查询(不考虑性能),提供假设条件下按工厂列出的零件编号列表。 (假设在下面的伪代码中列为 cmets。)

**Query 1** -- Parts sold in last 3 years
Plant, PartNo
UNION
**Query 2** -- Parts created in ERP in last year
Plant, PartNo
UNION
**Query 3** -- Parts in Inventory at run time
Plant, PartNo
UNION
**Query 4** -- Parts received in last 3 years
Plant, PartNo
UNION
**Query 5** -- Component parts of parts from queries 1 thru 4.

查询 5 的源表如下所示:

CREATE TABLE BOMTABLE (
    PLANT AS PLANT
    PARENT AS PARENT
    CHILD AS CHILD
    QTYPER AS QTYPER
    ...
);

我能够处理查询 1 到 4 并将它们联合起来以输出 PLANT、PARTNO,但第五个查询让我卡住了。我相信我需要使用 DB2 的 CONNECT_BY_ROOT 函数以及 START WITH 和 CONNECT BY PRIOR 来处理下面的伪代码,并将其联合到查询 1-4。

SELECT CONNECT_BY_ROOT
    PLANT,
    CHILD AS PARTNO
FROM BOMTABLE
START WITH
    PLANT IN (Queries 1 thru 4)
    AND
    PARENT IN (Queries 1 thru 4)
CONNECT BY PRIOR
    PLANT IN (Queries 1 thru 4)
    AND
    CHILD = PARENT

但是,当谈到 START WITH 和 CONNECT BY PRIOR 语句时,我感到很困惑。

  1. 我必须使用查询 1-4 作为 START WITH 子句的来源吗?鉴于此,我将如何做到这一点 我必须确保在执行时 PARENT 尊重适当的 PLANT。

  2. 对于 PLANT,我是否会将相同的条件从 START WITH 转移到 CONNECT BY PRIOR?对于 PARTNO I 在 CHILD = PARENT 的地方设置我的递归?

使用本文档作为参考:

IBM - Using recursive queries

【问题讨论】:

  • 使用 cte(公用表表达式)从查询 1 到 4 的并集获取结果集,并在最终选择中使用 CTE
  • 这不是很复杂吗?有多少程序员能够理解代码?要获取 BOM 的所有嵌套组件项的列表,我会将逻辑抽象为表函数。或者更简单,将组件项写入临时表的 SQL 过程。

标签: sql recursion db2 ibm-midrange db2-400


【解决方案1】:

使用递归公用表表达式 (RCTE) 而不是非标准的 CONNECT BY 构造

这里有一个BOM示例https://www.ibm.com/support/knowledgecenter/ssw_ibm_i_73/db2/rbafzrecurse.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-28
    • 2020-12-10
    • 1970-01-01
    • 2018-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多