You need to enable JavaScript to run this app. 使用递归SQL基于Part、Structure表查询发动机组成部件及汇总数量
优惠活动
大模型
产品
解决方案
定价
更多

使用递归SQL基于Part、Structure表查询发动机组成部件及汇总数量

实现方案

你的两个判断完全没问题:

  • 这个场景属于典型的多层级物料清单(BOM)嵌套拆解,必须使用递归逻辑才能适配任意深度的装配关系,硬编码固定层级的JOIN写法一旦遇到结构调整、嵌套层级增加就会出现数据遗漏。
  • 你推测需要用到SUM函数也是对的,因为同一个零件会分散在不同层级的装配关系中,需要按零件维度汇总总用量才能得到最终结果。

核心实现逻辑

整个递归拆解的核心是三层计算逻辑:

  1. 锚点起点:从根节点(也就是零件号为1的发动机)出发,取出它直接装配的所有子零件,记录每个子零件从发动机维度折算的初始用量。
  2. 递归展开:把每一步取出的子零件作为新的父件,继续查询它下属的装配组件,计算用量的时候要把父件从顶层累计下来的总用量,乘上当前装配关系里单份父件对应的子零件数量,直到遍历完所有没有下属组件的零件为止。
  3. 最终聚合:把所有递归过程得到的零件用量按零件维度分组求和,关联零件表拿到零件描述,就是你需要的结果。

可直接运行的SQL代码

WITH RECURSIVE part_breakdown AS (
    -- 锚点部分:取出发动机直接装配的零件及初始用量
    SELECT
        s.component_no,
        s.quantity AS total_quantity
    FROM Structure s
    WHERE s.part_no = 1 -- 根节点为发动机零件号
    UNION ALL
    -- 递归部分:逐层展开组件的下属零件,累计计算用量
    SELECT
        s.component_no,
        pb.total_quantity * s.quantity AS total_quantity
    FROM part_breakdown pb
    INNER JOIN Structure s 
        ON pb.component_no = s.part_no
)
-- 关联零件表获取描述,按零件维度汇总总用量
SELECT
    p.description,
    SUM(pb.total_quantity) AS quantity
FROM part_breakdown pb
INNER JOIN Part p 
    ON pb.component_no = p.part_no
GROUP BY p.description
ORDER BY p.description;

结果验证

把给出的示例数据代入查询,得到的结果和你预期的完全一致:

descriptionquantity
bearing1
casing1
screw10

注:其中screw的总用量刚好是发动机直接装配的2个,加上casing里装配的8个的总和,和你提到的预期计算逻辑完全匹配。

小提示

不同数据库的递归CTE语法略有差异:

  • MySQL、PostgreSQL 需要在CTE关键字后加上RECURSIVE标识
  • SQL Server、Oracle 不需要额外加RECURSIVE关键字,直接书写CTE结构即可,核心的递归计算逻辑完全通用。

内容的提问来源于stack exchange,提问作者lemur.01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 06:06:01