1

我想通过MS-SQL服务器上的Sage Manufacturing Line 50中的物料清单(BOM)递归迭代。Sage生产线50物料清单,SQL递归两个表树迭代

BOM树结构包含在两个表BOMHeader和BOMComponent中。这些链接由BOMHeader.ID = BOMComponent.HeaderID。所以通过链接这些和查询特定的BomHeader.BOMReference,我可以得到物料清单的第一层。

发生递归是因为每个BOMComponent本身可以是一个组件,它是StockCode,如果它存在为BOMHeader.BomReference,则表明它是一个子BOM,并且在BOMComponents表中具有子组件。

我花了大约一个半小时画一个图,但我需要10点名誉

WITH BOM_CTE (HID, HRef, HDesc, SC, CDesc, CHID, CQ, SEQ) 
AS 
(
    SELECT H.ID as HID, H.BomReference as HRef, H.Description as HDesc, C.StockCode as SC,C.Description as CDesc,C.HeaderID as CHID,C.Quantity as CQ,1 as SEQ 
    FROM [GNT\SAGEL50].[sagel50_46387].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_46387].[dbo].BomComponents C 
     ON H.ID = C.HeaderID 
    WHERE H.BomReference like 'SA000001%' 
    UNION ALL 
    SELECT H.ID as HID, H.BomReference as HRef, H.Description as HDesc, C.StockCode as SC,C.Description as CDesc,C.HeaderID as CHID,C.Quantity as CQ,BC.SEQ+1 
    FROM [GNT\SAGEL50].[sagel50_46387].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_46387].[dbo].BomComponents C 
     ON H.ID = C.HeaderID 
    JOIN BOM_CTE BC 
     ON HRef = BC.SC 
) 
Select * From BOM_CTE 

上面的代码只列出了顶级水平,并且不会再骂人,通过看我能不能将它张贴如果从BOMComponents表导出的结果库存代码作为BOMReference(表示它有子组件)出现在BOMHeader表中。

递归应该结束时,所有BomComponents必须在BomHeader.BomReference没有StockCode引用(意思是没有下级)

我是一个递归SQL代码语句,可以实现两个链接表递归查询树后。 我看了很多BOM问题,但他们似乎在一张表中,并且还有两张表CTE,但是我无法理解它,因为我对SQL相当陌生,尤其是递归。

预先感谢任何帮助

亚当

+0

莫非你给我们一个更好的表格结构?也许使用ascii和代码;然后查询你想要做什么?现在这看起来像是一堵文字,很难按照你的需要去做。 –

+0

我已编辑它可以删除请求 – Adamgsb

+0

递归延伸n级还是有限制树可能“高”? (如果限制合理,您可以对扩展进行硬编码) - PS是** BOM **应该表示什么?我一直解析“字节顺序标记”。 – 2014-03-07 21:15:01

回答

0
WITH BOM_CTE (HID, HRef, HDesc, SC, CDesc, CHID, CQ, SEQ) 
AS 
(
    --Anchor Member Definition 
    SELECT H.ID as HID, H.BomReference as HRef, H.Description as HDesc, C.StockCode as SC,C.Description as CDesc,C.HeaderID as CHID,C.Quantity as CQ,1 as SEQ 
    --GNT\SAGEL50.[sagel50_35648] refers to a database on a linked server on my main SQL server 
    FROM [GNT\SAGEL50].[sagel50_35648].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_35648].[dbo].BomComponents C 
     ON H.ID = C.HeaderID 
    WHERE H.BomReference like 'SA000009%' 
    UNION ALL 
    --Recursive Member Definition 
    SELECT H.ID , H.BomReference f, H.Description , C.StockCode ,C.Description ,C.HeaderID ,C.Quantity, BC.SEQ+1 
    FROM [GNT\SAGEL50].[sagel50_35648].[dbo].BomHeaders H 
    JOIN [GNT\SAGEL50].[sagel50_35648].[dbo].BomComponents C 
     ON H.ID = C.HeaderID 
    JOIN BOM_CTE BC 
     ON H.BomReference = BC.SC 
) 
Select * From BOM_CTE 

这现在工作,之后我删除了别名,所有我现在需要做的是通过BOMReference我想通过,而不是硬编码“SA000009”%迭代

0

这个讨论有一个有趣的答案,点返回显示怎么办“硬编码”扩大旧的线程。

mysql recursive(tree) parent child category

+0

感谢您的答复,但它不是我真正想要的,加上它只有一个表,我需要两个表,我希望用SQL递归CTE的。 – Adamgsb