DB2 SQL:将对BOM表文件执行的递归查询合并回其根列表

问题描述

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

**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来处理类似下面的伪代码,然后将其UNION到Queries 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子句的源?鉴于此,我该怎么办 我必须确保在执行时父母尊重相应的植物。

  2. 从植物的开始到开始,我将承担相同的条件吗?而对于PARTNO I 在孩子=父母的地方设置我的递归?

使用此文档作为参考:

IBM - Using recursive queries

解决方法

使用递归公用表表达式(RCTE),而不是非标准的data = pd.ExcelFile("/content/data.ods") sales = pd.read_excel(data,'Sheet1') customers = pd.read_excel(data,'Sheet2') dates = pd.read_excel(data,'Sheet3') employees = pd.read_excel(data,'Sheet4') sales.head() customers.head() dates.head() employees.head() 构造

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