【发布时间】: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-4 作为 START WITH 子句的来源吗?鉴于此,我将如何做到这一点 我必须确保在执行时 PARENT 尊重适当的 PLANT。
-
对于 PLANT,我是否会将相同的条件从 START WITH 转移到 CONNECT BY PRIOR?对于 PARTNO I 在 CHILD = PARENT 的地方设置我的递归?
使用本文档作为参考:
【问题讨论】:
-
使用 cte(公用表表达式)从查询 1 到 4 的并集获取结果集,并在最终选择中使用 CTE
-
这不是很复杂吗?有多少程序员能够理解代码?要获取 BOM 的所有嵌套组件项的列表,我会将逻辑抽象为表函数。或者更简单,将组件项写入临时表的 SQL 过程。
标签: sql recursion db2 ibm-midrange db2-400