【发布时间】: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