0
請在存儲過程中查看我的遞歸CTE。 的遞歸CTE爲我提供了一個表:BOM遞歸CTE /零件爆炸。 CTE中的錯誤
COMPONENTID,名稱,總
爲此,它會正確的,但也有一些缺陷:
- 對於這項工作,AssemblyId必須是空。沒有程序集的組件(例如孤兒)需要放在數據庫中,父項爲空。
- 該查詢還引入了我正在執行BOMcte的組件。例如如果我搜索計算機,我預計它會返回類似於:1x主板,4x Ram,1x CPU,1xCase。相反,它返回... 1x電腦,1x主板,4x Ram,1x CPU,1xCase。
- 從問題2開始,我們知道需要4個RAM來製作計算機。如果我在RAM上運行BOMcte,它會告訴我需要4個。它的工作方式是錯誤的。
任何人都可以幫我解決這個問題嗎?
理想情況下,我想重新構造它,如下所示: 傳入存儲過程ParentId並遞歸查詢查找所有子節點和數量。如果家長沒有孩子,那麼CTE應該返回一個空表。
非常感謝提前。
ALTER PROCEDURE dbo.SP_PartExploder
@pid int
AS
/* SET NOCOUNT ON */
WITH BOMcte(ComponentId, Name, Quantity, AssemblyId)
AS
(
SELECT b.ComponentID,
p.Name,
b.Quantity,
b.AssemblyId
FROM PartComponents AS b
INNER JOIN Parts p
on b.ComponentId = p.PartId
WHERE b.ComponentId = @pid
UNION ALL
SELECT b.ComponentID,
p.Name,
b.Quantity,
b.AssemblyId
FROM PartComponents as b
INNER JOIN Parts p
ON b.ComponentId = p.PartId
INNER JOIN BOMcte AS cte
ON b.AssemblyId = cte.ComponentId
)
SELECT ComponentId, Name, sum(Quantity) as Total
FROM BOMcte
group by ComponentId, Name;
RETURN