【问题标题】:Microsoft SQL - Bill of material, how to query only lowest parts in hierarchyMicrosoft SQL - 物料清单,如何仅查询层次结构中的最低部分
【发布时间】:2022-11-30 23:35:18
【问题描述】:

我有经典的物料清单表:

零件编号 |子零件编号 |数量 1 2 2 1 3 4 1 5 8 2 8 13

当给定 PartId 时,我只想要那些不是零件的 SubPartId(PartId 列中不存在 SubPartId),它们是材料,因此它们在层次结构中最低。如果给定 PartId = 1,我希望查询返回 3、5、8,因为这些部分没有任何子部分,不知道该怎么做。

尝试简单的递归:

with BOM as (
    SELECT  parts.PartId,
            parts.SubPartId
    FROM Parts parts
    WHERE parts.PartId = 1
    UNION ALL
    SELECT  components.PartId,
            components.SubPartId
    FROM Parts components
    JOIN BOM B
        on B.SubPartId = components.SubPartId )
        

从这个查询中我得到 2 , 3 ,5 , 8 ,但我不想要 2 因为它不重要。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    欢迎来到堆栈溢出。

    让我们快速谈谈提供演示数据的问题。

    对于这样的问题,您使用的数据和模式对我们能够回答您的问题非常有帮助。考虑:

    DECLARE @parts TABLE (PartID INT, SubPartID INT, Quantity INT)
    INSERT INTO @parts (PartID, SubPartID, Quantity) VALUES
    (1, 2, 2), (1, 3, 4),
    (1, 5, 8), (2, 8, 13)
    

    这会生成一个表变量来描述您的表及其列,以及一些要使用的示例数据。

    关于你的问题!

    根据您的描述,您似乎想知道给定部分的子部分是什么,它们本身不是部分。使用上面的例子,我们可以这样写:

    SELECT p.SubPartID
      FROM @parts p
        LEFT OUTER JOIN @parts p2
          ON p.SubPartID = p2.PartID
     WHERE p2.PartID IS NULL
    

    产生结果集:

    SubPartID
    ---------
    3
    5
    8
    

    我们在做什么?我们使用 LEFT OUTER JOIN 连接回 SubPartID 列上的同一个表。由于我们不想要匹配的行,因此我们可以使用 WHERE 子句过滤掉非空值。

    【讨论】:

      猜你喜欢
      • 2021-09-15
      • 2012-03-29
      • 1970-01-01
      • 2013-08-27
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      相关资源
      最近更新 更多