请查看存储过程中的递归CTE。递归CTE为我提供了一个表,其中包含:
组件ID,名称,总
它正确地做到了这一点,但也有一些错误:
- 要使其工作,AssemblyId必须可以为null。没有程序集的组件(例如孤立组件)需要放置在父级为null的数据库中
- 该查询还拉入了我正在进行BOMcte的组件。例如,如果我搜索Computer,我希望它会返回类似以下内容:1x主板、4x内存、1x CPU、1xCase。相反,它返回。。。1x电脑,1x主板,4x内存,1x CPU,1x机箱
- 根据问题2,我们知道制造一台计算机需要4个内存。如果我在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
看起来您可以通过向外部SELECT添加条件来轻松修复它,如下所示:
...
SELECT ComponentId, Name, sum(Quantity) as Total
FROM BOMcte
WHERE ComponentId <> @pid
group by ComponentId, Name;