BOM递归CTE/零件分解.CTE中的Bug



请查看存储过程中的递归CTE。递归CTE为我提供了一个表,其中包含:

组件ID,名称,总

它正确地做到了这一点,但也有一些错误:

  1. 要使其工作,AssemblyId必须可以为null。没有程序集的组件(例如孤立组件)需要放置在父级为null的数据库中
  2. 该查询还拉入了我正在进行BOMcte的组件。例如,如果我搜索Computer,我希望它会返回类似以下内容:1x主板、4x内存、1x CPU、1xCase。相反,它返回。。。1x电脑,1x主板,4x内存,1x CPU,1x机箱
  3. 根据问题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; 

相关内容

  • 没有找到相关文章

最新更新