首页 > 解决方案 > BoM 和子装配 CTE 查询

问题描述

我正在尝试使用以下信息创建 CTE 查询。我正在尝试进行 BoM 爆炸,其中列出了特定 BoM 的所有子组件。这是我的表结构。

物料清单表

BOM_ID  TITLE
------  -----
1       BOM1
2       BOM2
3       BOM3
4       BOM4
5       BOM5
6       BOM6
7       BOM7
8       BOM8
9       BOM9
10      BOM10
11      BOM11
12      BOM12

子组件

SUB_ASSEMBLY_ID PARENT_BOM_ID SUB_ASSEMBLY_TITLE BOM_ID
--------------- ------------- ------------------ ------
1               1             BOM1               1
1               1             BOM2               2
2               1             BOM3               3
3               1             BOM4               4
4               2             BOM5               5
5               2             BOM6               6
6               6             BOM7               7
7               7             BOM8               8
8               1             BOM9               9
9               10            BOM10              10
10              10            BOM11              11

SUB_ASSEMBLIES 表中的 BOM_ID 是带有 SUB_ASSEMBLY_TITLE 的 BOMS 表中的 BOM_ID。SUB_ASSEMBLIES 表中的 PARENT_BOM_ID 是 BOMS 表中的直接父 BOM_ID。如果我选择 BOM1,我会尝试一直列出所有子组件,直到没有剩余子组件。通过选择 BOM1,我应该得到 BOM1、BOM2、BOM3、BOM4、BOM5、BOM6、BOM7、BOM8、BOM9。BOM10 和 BOM11 不会成为列表的一部分,因为它们或它们的任何子组件都没有以任何方式与 BOM1 关联。

我尝试了 CTE 查询的不同变体,但没有成功。这是我尝试过的最新查询。

CTE SQL 查询

WITH bom_with_subassemblies AS (
    SELECT DISTINCT b.TITLE AS PARENT, s.SUB_ASSEMBLY_TITLE AS CHILD, s.PARENT_BOM_ID
        FROM BOMS b INNER JOIN SUB_ASSEMBLIES s ON b.BOM_ID = s.BOM_ID
        WHERE b.BOM_ID = 1

  UNION ALL

  SELECT bwr.PARENT, bwr.CHILD, bwr.PARENT_BOM_ID
  FROM bom_with_subassemblies bwr, BOMS b
  WHERE bwr.PARENT_BOM_ID = b.BOM_ID
)
SELECT * FROM bom_with_subassemblies

当我执行上面的查询时,我收到一个The maximum recursion 100 has been exhausted before statement completion错误。

可以修改查询以获取所需信息吗?还是我必须修改我的表结构以适应这样的 CTE 查询?

标签: sqlcommon-table-expression

解决方案


推荐阅读