我最近刚刚开始自学 SQL,并且已经能够从各种教程中拼凑出我需要的几乎所有东西,但是这个让我把头撞到了墙上。我们有一个表格,其中包含我们产品的所有物料清单信息。我只需要其中的 4 列 - PPN_I、CPN_I、QUANTITY_I、BOMNAME_I - 分别是项目编号、原材料编号、数量和 BOMName。许多 BOM 包含子装配体。我需要一个列出 BOM 的所有组件的结果集,无论级别如何。我很确定我需要使用递归查询,但不能完全得到它,任何帮助将不胜感激。我知道还有其他几个 BOM 问题,但它们似乎都有不同的表结构。所以 -
一开始,我只是想获得一个特定项目的结果,以方便我的猜测和检查工作。完成后,我需要所有项目的报告,或者至少是项目列表。其中许多项目是可配置的并且具有多个 BOM。为了获得默认设置,我正在寻找一个空白的 BOM 名称。
我可以运行它并获得第一级:
select bm.ppn_i, bm.cpn_i, bm.bomname_i, bm.QUANTITY_I, 1 as BOMLevel
from BM010115 bm
where bm.PPN_I like '0123105-HWT' and bm.BOMNAME_I like ''
问题是一个(或多个)行的 cpn_i 值是一个子程序集。要查看子组件的组成,我需要将第一个查询的每个结果放回同一个查询中。
select bm.ppn_i, bm.cpn_i, bm.bomname_i, bm.QUANTITY_I, 2 as BOMLevel
from BM010115 bm
where bm.PPN_I like 'ZC-BASESUBLIM' and bm.BOMNAME_I like ''
显然,这不是最有效的方法。我试过了,我试过了,但我似乎无法得到正确的结果。我经历了很多不同的版本,这是我最近所做的/最接近的。
With BMStudy as
(select bm.ppn_i, bm.cpn_i, bm.bomname_i, bm.QUANTITY_I, 1 as BOMLevel
from BM010115 bm
where bm.PPN_I like '0123105-HWT' and bm.BOMNAME_I like ''
UNION ALL
select bb.ppn_i, ba.cpn_i, bb.bomname_i, ba.quantity_i, 2 as BOMLevel
from BM010115 bb, BMStudy ba
where bb.BOMNAME_I like '' and ba.PPN_I = bb.CPN_I)
select * from BMStudy
这仅返回第一级结果。我不相信任何 BOM 的深度都超过 3 层,但我希望有一列表明它是哪一层。有人可以指出我正确的方向或给我一些关于我哪里出错的指示吗?
TL;DR - 需要提取 BOM 中的所有组件的查询,然后为第一个查询的所有结果提取 BOM 组件并将其添加到结果集中。
谢谢