本文介绍了如何使用递归CTE(公用表表达式)逻辑编写SQL语句,以展开多级BOM(物料清单)而无需创建存储过程或函数。作者强调了SQL的集合思维优于传统编程的遍历思维,并提供了详细的SQL代码和结果验证。同时,作者指出代码在蓝海机械测试环境中验证通过,并建议根据具体需求选择是否封装为存储过程或函数以提高执行效率。
一、前言
有很多用户想要多级展开BOM的SQL语句,社区里面也有相关的问题,有一些伙伴也已经提出过解决方案,但是都是要创建存储过程或者是函数,而且都是使用循环或者游标的方式来实现的。
这个也是解决问题的一种方案,当然没有问题,但是个人的想法:SQL本质上是一种集合思维,最高效的处理方案应该是使用集合思维的解决方案,而不是用传统编程的遍历思维。
所以在此提供一段本人编写的SQL语句,利用的是递归CTE的逻辑,也可以实现展开多级BOM,不需要创建存储过程或者函数即可执行、查询出结果。供大家参考。如果大家有更好的方案,也可以提出来,一起交流学习~
二、解决方案
首先介绍一下CTE,全名叫做公用表表达式(Common Table Expression),是微软T-SQL的一种拓展。其他数据库(Oracle、MySQL等)不知道有没有支持,大家使用前请先确认此条件。然后T-SQL的CTE的基本语法大家可以参考此帖子学习一下:https://www.cnblogs.com/ljhdo/p/4580347.html 里面的示例和讲解都挺详细的~
下面我先以截图的方式展示一下我编写的展开多级BOM的SQL语句,然后具体的代码大家可以下载附件来看看!
2.1 SQL代码:
2.2 结果验证:
在蓝海机械前台查询1.01.003的物料清单正查结果,如下:
在数据库中查询1.01.003的物料清单展开结果,如下:
对比两张图可以得知,展开结果是一样的。
三、备注
3.1 以上代码和结果示例都是在蓝海机械的测试账套中测试验证通过的,大家有蓝海机械测试环境的可以直接下载附件的SQL去执行即可得到结果。
注意:附件中有两个SQL文件,分别实现子项半成品如果有多个BOM版本的话,是根据它最新的BOM版本来展开,还是根据父项产品BOM中所指定的子项BOM版本来展开。大家留意一下附件中的SQL文件的名称即可区分!
3.2 虽然我提供的脚本是可以直接执行出结果的,但是建议大家,如果是有经常使用,或者是需要用到插件代码中,还是建议封装成存储过程或者函数会更方便一些,而且这样数据库引擎的查询执行效率会更高!
至此,全文终。
两个SQL,分别是按照子项最新的BOM版本展开和按照指定的B …(5.79KB)