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