首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在递归问题中显示最低级别的componentID

在递归问题中显示最低级别的componentID
EN

Stack Overflow用户
提问于 2020-09-09 16:06:49
回答 2查看 42关注 0票数 1

我正在处理制造数据,试图将组件爆炸到它们最颗粒状的部件和数量。以下是一些简化的示例数据:

代码语言:javascript
复制
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之前完成。要制作一个C程序集,需要4个B程序集。

反过来,B也是一个程序集,而3个A和10个X组件是必需的,可以使1 B

目标是显示需要多少AX组件才能生成一个D。以下是我迄今为止的尝试:

代码语言:javascript
复制
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;

虽然这个查询在最深层为AX提供了正确的数量,但它没有为AX显示正确的NestedComponentID。

在红色矩形中,我期望ComponentID列显示B,NestedComponentID列分别显示AX。如何修改查询以实现预期的结果?

而且,这个样本数据只有3个层次。还有其他更深的程序集,因此解决方案也需要能够为更深的程序集工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-09 16:27:03

根据您的深度,组件和NestedComponent之间的关系似乎非常随意。

我的预期产出是..。

代码语言:javascript
复制
1   B   1   B    3   A   (Assembly B is made from 1 B, which is made from  3 A)
1   B   1   B   10   X   (Assembly B is made from 1 B, which is made from 10 X)

1   C   1   C    4   B   (Assembly C is made from 1 C, which is made from  4 B)
2   C   4   B   12   A   (Assembly C is made from 4 B, which is made from 12 A)
2   C   4   B   40   X   (Assembly C is made from 4 B, which is made from 40 X)

1   D   1   D    2   C   (Assembly D is made from 1 D, which is made from  2 C)
2   D   2   C    8   B   (Assembly D is made from 2 C, which is made from  8 B)
3   D   8   B   24   A   (Assembly D is made from 8 B, which is made from 24 A)
3   D   8   B   80   X   (Assembly D is made from 8 B, which is made from 80 X)

那么,在每一个层面上,意义都是一致的?

(如果你同意的话,我会对它进行编码。如果您不同意,请编辑您的问题,以具体说明每个领域的含义在每个深度水平。)

编辑: SQL

代码语言:javascript
复制
WITH
  assemblyTree AS
(
  SELECT
    0                   AS Depth,
    AssemblyID          AS AssemblyID,
    1                   AS ComponentCount,
    AssemblyID          AS ComponentID,
    Quantity            AS NestedComponentCount,
    ComponentID         AS NestedComponentID 
  FROM
    #assemblies
 
  UNION ALL
  
  SELECT
    parent.Depth + 1,
    parent.AssemblyID,
    parent.NestedComponentCount,
    parent.NestedComponentID,
    parent.NestedComponentCount * Child.Quantity,
    child.ComponentID
  FROM
    assemblyTree   AS parent
  INNER JOIN
    #assemblies    AS child
      ON parent.NestedComponentID = child.AssemblyID
)
SELECT
  *
FROM
  assemblyTree
ORDER BY
  AssemblyID,
  Depth,
  ComponentID,
  NestedComponentID

https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=497a0eff8b581adbf9a0070f052b00d6

注意:通过使顶层行与子行一致,一切都变得容易了。

票数 2
EN

Stack Overflow用户

发布于 2020-09-09 19:03:00

代码语言:javascript
复制
;WITH assemblie_line
AS (
    SELECT  AssemblyID  , 
            ComponentID ,
            Quantity
    FROM #assemblies
    WHERE AssemblyID = 'D'

    UNION ALL

    SELECT  L.AssemblyID                ,
            A.ComponentID               ,
            L.Quantity * A.Quantity
    FROM assemblie_line L
    JOIN #assemblies A ON A.AssemblyID = L.ComponentID
)
SELECT * 
FROM assemblie_line X
WHERE X.ComponentID = 'X'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63815472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档