我有一个包含两个表的数据库。第一个是部件号列表,第二个是与父部件关联的组件列表。
表1 - Inv
表2 - Bom
第三个表是基本的销售订单明细表。
blow SQL命令返回Bom表中找到的所有项目,其中包含Product Product' FG'的部分。
SELECT SD.SalesOrderLine, SD.StockCode, SD.BackOrderQty*Bom.QtyPer AS TotalReq,
Bom.Component, SD.MLineShipDate
FROM SalesOrder SD
JOIN Bom ON SD.StockCode=Bom.ParentPart
JOIN Inv On BS.Component=Inv.StockCode
WHERE SD.SalesOrder=xxxxx
AND Inv.ProductClass='FG'
我现在遇到的问题是,一些返回的组件部分也可能在Bom表中包含一个条目作为父部件。因此,我需要返回所有带有' FG'初始父部件下的类,每个部件具有适当的总数量。这可能不会返回任何结果,但同时可以返回1到4个子查询层。
示例数据
INV
的Bom
根据这些数据,处理2" Part1"应该返回以下
结果
答案 0 :(得分:1)
我希望这会对你有所帮助:
;WITH cte AS (
SELECT CAST(NULL as nvarchar(6)) as Parent,
StockCode as Child,
ProductClass
FROM Inv
WHERE StockCode = 'Part1'
UNION ALL
SELECT b.ParentPart,
b.Component,
i.ProductClass
FROM Bom b
INNER JOIN cte c
ON c.Child = b.ParentPart
INNER JOIN Inv i
ON i.StockCode = b.Component AND i.ProductClass = c.ProductClass
)
SELECT *
FROM cte
WHERE Parent IS NOT NULL
输出:
Parent Child ProductClass
Part1 Part4 FG
Part1 Part6 FG
Part6 Part9 FG
Part9 Part11 FG
Part11 Part12 FG
您可以从CTE中删除WHERE
语句以获取所有层次结构。并将此CTE与另一张表联系起来。