【问题标题】:T-SQL Recursive using CTE (Know the grand parent)使用 CTE 的 T-SQL 递归(了解祖父)
【发布时间】:2014-05-20 13:48:27
【问题描述】:

我想使用 CTE 表达式来创建所有正在销售的材料的递归查询 (BOM)。我的 CTE 工作正常,但问题是我总是想保留祖父(出售的成品)。因此,例如,如果我有一个 BOM,其中包含本身具有 BOM 的成分,最后,我想要所有级别的所有成分,但保留成品,而不是具有 BOM 的成分项目。

这是我的 CTE:

    With MyCTE
    as
    (
      Select    H.Item, H.BOMQuantity, D.ComponentItem, D.NetQuantity, 0 as Lvl
      From Manufacturing.BillOfMaterialHeader H
      Inner Join Manufacturing.BillOfMaterialDetail D On H.Item = D.Item And GetDate() BETWEEN D.EffectiveFrom And D.EffectiveTo
      Inner Join Common.Item I On H.Item = I.Item 
      Where I.ItemGroup = 'U006'

      UNION ALL

      Select    H.Item, H.BOMQuantity, D.ComponentItem, D.NetQuantity, Lvl + 1
      From Manufacturing.BillOfMaterialHeader H
      Inner Join Manufacturing.BillOfMaterialDetail D On H.Item = D.Item And GetDate() BETWEEN D.EffectiveFrom And D.EffectiveTo
      Inner Join MyCTE B On D.Item = B.ComponentItem
    )

    Select * 
    From MyCTE

所以我想要的“项目”总是来自 CTE 中查询的第一部分的项目,可销售的产品,然后通过递归的东西来获得所有级别的所有成分......但是可以找不到路。

任何帮助将不胜感激。 谢谢

【问题讨论】:

  • 嗯...我认为您可能对 BOM 的实际含义有一些误解。它是一个 Unicode 字符,用于指示文件或文本流的字节顺序。在这种情况下,您的意思是什么——是物料清单吗?还是我有点厚?
  • @StevePettifer 也许是物料清单?
  • 是物料清单的意思,是一个比较标准的名词。
  • 是的,我的大脑刚刚跟上。但是这个问题被标记为字节顺序标记,这就是为什么我有点困惑!
  • 对不起,字节顺序标记上的混淆,我添加了标签 BOM,但后来没有注意到它转换了句子:(

标签: sql sql-server recursion common-table-expression


【解决方案1】:

试试这个

With MyCTE
as
(
  Select   H.Item as BaseItem, H.Item, H.BOMQuantity, D.ComponentItem, D.NetQuantity, 0 as Lvl
  From Manufacturing.BillOfMaterialHeader H
  Inner Join Manufacturing.BillOfMaterialDetail D On H.Item = D.Item And GetDate() BETWEEN D.EffectiveFrom And D.EffectiveTo
  Inner Join Common.Item I On H.Item = I.Item 
  Where I.ItemGroup = 'U006'

  UNION ALL

  Select   
      B.BaseItem,
      H.Item, 
      H.BOMQuantity, D.ComponentItem, D.NetQuantity, Lvl + 1
  From Manufacturing.BillOfMaterialHeader H
  Inner Join Manufacturing.BillOfMaterialDetail D On H.Item = D.Item And GetDate() BETWEEN D.EffectiveFrom And D.EffectiveTo
  Inner Join MyCTE B On D.Item = B.ComponentItem
)

Select * 
From MyCTE

【讨论】:

  • 感谢 podiluska,工作正常。今天什么都找不到,应该在床上躺着……
猜你喜欢
  • 2020-10-05
  • 2013-11-03
  • 1970-01-01
  • 2014-05-19
  • 1970-01-01
  • 2015-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多