一尘不染

物料清单的递归查询

sql

我最近才刚刚开始自学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表组件,并将其添加到结果集中。

谢谢


阅读 314

收藏
2021-03-10

共1个答案

一尘不染

戈登,我对您的帮助深表谢意。您帮助了我一些基本的缺陷,并且完成了一些调整,并且在大多数情况下满足了我的需求……至少到目前为止。这已经让我发疯了很长一段时间。我确定的代码在下面,以防将来对其他人有所帮助

  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)

再次感谢!

2021-03-10