使用递归SQL基于Part、Structure表查询发动机组成部件及汇总数量
实现方案
你的两个判断完全没问题:
- 这个场景属于典型的多层级物料清单(BOM)嵌套拆解,必须使用递归逻辑才能适配任意深度的装配关系,硬编码固定层级的JOIN写法一旦遇到结构调整、嵌套层级增加就会出现数据遗漏。
- 你推测需要用到
SUM函数也是对的,因为同一个零件会分散在不同层级的装配关系中,需要按零件维度汇总总用量才能得到最终结果。
核心实现逻辑
整个递归拆解的核心是三层计算逻辑:
- 锚点起点:从根节点(也就是零件号为1的发动机)出发,取出它直接装配的所有子零件,记录每个子零件从发动机维度折算的初始用量。
- 递归展开:把每一步取出的子零件作为新的父件,继续查询它下属的装配组件,计算用量的时候要把父件从顶层累计下来的总用量,乘上当前装配关系里单份父件对应的子零件数量,直到遍历完所有没有下属组件的零件为止。
- 最终聚合:把所有递归过程得到的零件用量按零件维度分组求和,关联零件表拿到零件描述,就是你需要的结果。
可直接运行的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;
结果验证
把给出的示例数据代入查询,得到的结果和你预期的完全一致:
| description | quantity |
|---|---|
| bearing | 1 |
| casing | 1 |
| screw | 10 |
注:其中screw的总用量刚好是发动机直接装配的2个,加上casing里装配的8个的总和,和你提到的预期计算逻辑完全匹配。
小提示
不同数据库的递归CTE语法略有差异:
- MySQL、PostgreSQL 需要在CTE关键字后加上
RECURSIVE标识 - SQL Server、Oracle 不需要额外加
RECURSIVE关键字,直接书写CTE结构即可,核心的递归计算逻辑完全通用。
内容的提问来源于stack exchange,提问作者lemur.01
相关产品推荐
相关产品推荐

