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