0

私の再帰的なCTEをストアドプロシージャで見てみてください。それは、これは正しく、しかし、いくつかのバグがあるん、 BOM再帰CTE /部品の爆発。 CTEのバグ

合計

COMPONENTID、名前: 再帰CTEを持つテーブルで私を提供し、この作業では

  1. 、AssemblyIdがなければなりませんnull可能です。アセンブリのないコンポーネント(孤児など)は、親に対してnullのdbに配置する必要があります。
  2. また、BOMcteを実行しているコンポーネントがクエリで取得されます。例えば私がコンピュータを検索すると、1xマザーボード、4x RAM、1x CPU、1xCaseのようなものを返すと期待しています。代わりに、1xComputer、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外側に条件を追加することによって、それを修正することができたように見えます:

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