You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在辅料BOM父子结构中按行而非列展示父件与组件?

解决BOM结构扁平化展示为两列的方案

嘿,这个需求用**递归CTE(公共表表达式)**就能完美解决!因为BOM是典型的树形层级结构,递归查询可以帮你把多层级的组件关系全部扁平化成ParentPartComponent两列的父-子对,不管嵌套多少层都能搞定,完全替代之前的列扩展方式。

核心思路

递归CTE分为两部分:

  1. 基础查询:先获取所有直接的父件-组件关系(也就是第一层的关联);
  2. 递归查询:把已经查到的组件当作新的父件,继续关联它的子组件,循环遍历所有层级,直到没有更深的子组件为止。

具体SQL示例(适用于MySQL 8+、PostgreSQL、SQL Server等支持递归CTE的数据库)

假设你的BOM表名为bom_data,包含ParentPartComponent两列,代码如下:

WITH RECURSIVE flattened_bom AS (
    -- 第一步:获取所有直接的父-子关系
    SELECT ParentPart, Component
    FROM bom_data
    WHERE ParentPart IS NOT NULL  -- 可根据实际情况调整,比如保留顶层无父件的物料
    
    UNION ALL
    
    -- 第二步:递归遍历深层组件,把子组件作为新父件继续查询
    SELECT fb.ParentPart, bd.Component
    FROM flattened_bom fb
    JOIN bom_data bd ON fb.Component = bd.ParentPart
)
-- 最终输出所有层级的父-子对,DISTINCT避免重复(如果有循环引用可额外处理)
SELECT DISTINCT ParentPart, Component
FROM flattened_bom
ORDER BY ParentPart;

补充说明

  • 如果你的BOM存在循环引用(比如组件A包含组件B,组件B又包含组件A),可以在递归部分添加层级计数字段,限制最大遍历层级来避免无限循环;
  • 如果只需要展示直接组件(不需要深层嵌套的组件),那更简单,直接执行SELECT ParentPart, Component FROM bom_data;即可;
  • 执行后你就能得到和示例一致的两列结果,每一行对应一对父件和它的组件(包括所有层级的嵌套组件)。

内容的提问来源于stack exchange,提问作者Jalal Mirahmadi

火山引擎 最新活动