如何在辅料BOM父子结构中按行而非列展示父件与组件?
解决BOM结构扁平化展示为两列的方案
嘿,这个需求用**递归CTE(公共表表达式)**就能完美解决!因为BOM是典型的树形层级结构,递归查询可以帮你把多层级的组件关系全部扁平化成ParentPart和Component两列的父-子对,不管嵌套多少层都能搞定,完全替代之前的列扩展方式。
核心思路
递归CTE分为两部分:
- 基础查询:先获取所有直接的父件-组件关系(也就是第一层的关联);
- 递归查询:把已经查到的组件当作新的父件,继续关联它的子组件,循环遍历所有层级,直到没有更深的子组件为止。
具体SQL示例(适用于MySQL 8+、PostgreSQL、SQL Server等支持递归CTE的数据库)
假设你的BOM表名为bom_data,包含ParentPart和Component两列,代码如下:
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




