我最近才刚刚开始自学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表组件,并将其添加到结果集中。
谢谢
戈登,我对您的帮助深表谢意。您帮助了我一些基本的缺陷,并且完成了一些调整,并且在大多数情况下满足了我的需求……至少到目前为止。这已经让我发疯了很长一段时间。我确定的代码在下面,以防将来对其他人有所帮助
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 ba.ppn_i, bb.cpn_i, bb.bomname_i, bb.quantity_i, (BOMLevel + 1) as BOMLevel from BMStudy ba join BM010115 bb on ba.cpn_i = bb.ppn_i where bb.BOMNAME_I like '' ) select top 1000 BMStudy.*, i.ITEMDESC from BMStudy, iv00101 i where CPN_I = itemnmbr order by BOMLEVEL, CPN_I ASC OPTION (MAXRECURSION 0)
再次感谢!