【发布时间】:2020-12-28 02:41:55
【问题描述】:
我正在处理制造数据,试图将组件分解为最细粒度的组件和数量。以下是一些简化的示例数据:
select *
into #assemblies
from
(
values
('D', 'C', 2),
('C', 'B', 4),
('B', 'A', 3),
('B', 'X', 10)
) d (AssemblyID, ComponentID, Quantity);
select * from #assemblies;
这是说需要一个 D 组件 2 C 组件。C 组件也是一个组件,必须在制作 D 之前制作。要制作 1 个 C 程序集,需要 4 个 B 程序集。
反过来 B 也是一个组件,需要 3 个 A 和 10 个 X 组件组成 1 个 B。
目标是显示需要多少个A 和X 组件才能生成1 个D。到目前为止,这是我的尝试:
with assemblies as
(
select Depth = 1, AssemblyID, ComponentID, NestedComponentID = ComponentID, Quantity
from #assemblies a --anchor member
union all
select Depth = a.Depth + 1, r.AssemblyID, r.ComponentID, NestedComponentID = a.ComponentID, Quantity = r.Quantity * a.Quantity
from #assemblies r --recursive member
inner join assemblies a
on r.ComponentID = a.AssemblyID
)
select * from assemblies order by AssemblyID, Depth;
虽然此查询在最深层为 A 和 X 提供了正确的数量,但它没有显示 A 和 X 的正确 NestedComponentID。
在红色矩形中,我希望 ComponentID 列显示 B,而 NestedComponentID 列分别显示 A 和 X。如何修改查询以达到预期结果?
此外,此示例数据只有 3 个级别。还有其他更深的程序集,因此该解决方案也需要能够适用于更深的程序集。
【问题讨论】:
标签: sql sql-server tsql recursion