0

請在存儲過程中查看我的遞歸CTE。 的遞歸CTE爲我提供了一個表:BOM遞歸CTE /零件爆炸。 CTE中的錯誤

COMPONENTID,名稱,總

爲此,它會正確的,但也有一些缺陷:

  1. 對於這項工作,AssemblyId必須是空。沒有程序集的組件(例如孤兒)需要放在數據庫中,父項爲空。
  2. 該查詢還引入了我正在執行BOMcte的組件。例如如果我搜索計算機,我預計它會返回類似於:1x主板,4x Ram,1x CPU,1xCase。相反,它返回... 1x電腦,1x主板,4x Ram,1x CPU,1xCase。
  3. 從問題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 

回答

0

看起來你可以很容易地通過添加條件外修復它選擇這樣的:

... 
SELECT ComponentId, Name, sum(Quantity) as Total 
FROM BOMcte 
WHERE ComponentId <> @pid 
group by ComponentId, Name;