SQL 如何用 WITH 子句递归计算 BOM(物料清单)展开

来源:Vuejs社区作者:长沙GEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《SQL 如何用 WITH 子句递归计算 BOM(物料清单)展开》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL 如何用 WITH 子句递归计算 BOM(物料清单)展开》有用,将其分享出去将是对创作者最好的鼓励。

在ERP或制造系统中,BOM(物料清单)通常表现为自引用的父子结构:一个成品由多个半成品或原材料组成,而半成品又会继续向下展开。使用SQL的WITH子句(即公用表表达式CTE)可以很方便地写出递归查询,把多层BOM一次展开。

SQL 如何用 WITH 子句递归计算 BOM(物料清单)展开

一、准备示例表结构

我们假设有一张 bom 表,记录物料之间的组成关系以及单份父件所需子件的数量:

CREATE TABLE bom (
  parent_id   INT,      -- 父物料ID
  child_id    INT,      -- 子物料ID
  qty         DECIMAL(10,2)  -- 单份父件需要子件的数量
);

INSERT INTO bom VALUES
(1, 2, 2),   -- 成品1需要2个物料2
(1, 3, 1),   -- 成品1需要1个物料3
(2, 4, 3),   -- 物料2需要3个物料4
(2, 5, 1),   -- 物料2需要1个物料5
(3, 5, 2);   -- 物料3需要2个物料5

二、使用 WITH 递归展开 BOM

递归CTE包含两部分:锚点查询和递归查询。锚点部分选出最顶层物料,递归部分不断关联子层。

WITH RECURSIVE bom_expand AS (
  -- 锚点:从成品1开始
  SELECT
    parent_id   AS top_id,
    child_id    AS material_id,
    qty         AS direct_qty,
    1           AS level,
    qty         AS total_qty
  FROM bom
  WHERE parent_id = 1

  UNION ALL

  -- 递归:继续向下展开
  SELECT
    b.top_id,
    b.child_id,
    b.qty,
    e.level + 1,
    e.total_qty * b.qty
  FROM bom_expand e
  JOIN bom b ON e.material_id = b.parent_id
)
SELECT
  top_id,
  material_id,
  level,
  total_qty
FROM bom_expand
ORDER BY level, material_id;

代码说明

  • top_id 记录最顶层的成品编号,方便区分不同展开树。
  • level 表示展开层级,成品的下一级为1。
  • total_qty 为相对顶层物料的累计需求量,由每一层 direct_qty 连乘得出。

三、查询结果解读

以上语句会返回如下形式的展开数据:

top_idmaterial_idleveltotal_qty
1212.00
1311.00
1426.00
1521.00
1522.00

注意物料5出现在两层不同路径中,若需合并相同子件的总用量,可再套一层 GROUP BY:

SELECT
  material_id,
  SUM(total_qty) AS sum_qty
FROM bom_expand
GROUP BY material_id
ORDER BY material_id;

四、注意事项

递归CTE必须包含 UNION ALL 且递归部分不能形成环,若数据可能存在循环依赖,应增加路径校验字段避免无限递归。

在 Oracle 中可省略 RECURSIVE 关键字,在 SQL Server 同样支持 WITH 子句递归,但写法中不必写 RECURSIVE。只要掌握锚点加递归连接的核心逻辑,就能适配多数关系型数据库完成 BOM 展开计算。

SQLWITH子句BOM展开修改时间:2026-07-29 17:24:38

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。