BOM Recursive CTE / Взрыв деталей.Ошибка в CTE - PullRequest
0 голосов
/ 19 марта 2012

Пожалуйста, посмотрите на мой Рекурсивный CTE в хранимой процедуре.Рекурсивный CTE предоставляет мне таблицу с:

ComponentId, Name, Total

Это делает это правильно, однако есть некоторые ошибки:

  1. Для этогоработа, AssemblyId должен быть обнуляемым.Компонент без сборки (например, сирота) должен быть помещен в базу данных с нулем для родителя.
  2. В запрос также добавляется компонент, над которым я выполняю BOMcte.Например, если я ищу компьютер, я ожидаю, что он выдаст что-то вроде: 1x материнская плата, 4x оперативная память, 1x процессор, 1xCase.вместо этого он возвращает ... 1xComputer, 1x материнская плата, 4x RAM, 1x CPU, 1xCase.
  3. Исходя из задачи 2, мы знаем, что для создания компьютера требуется 4 оперативной памяти.Если я запускаю 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

1 Ответ

0 голосов
/ 20 марта 2012

Похоже, вы можете легко исправить это, добавив условие к внешнему SELECT следующим образом:

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