SQL:金蝶云星空BOM多级展开语句,不需要循环处理原创
金蝶云社区-imY身份
imY
106人赞赏了该文章 12156次浏览 未经作者许可,禁止转载编辑于2021年09月15日 17:01:36
封面

一、前言

        有很多用户想要多级展开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代码:

image.png

image.png

        2.2 结果验证:

在蓝海机械前台查询1.01.003的物料清单正查结果,如下:

image.png

在数据库中查询1.01.003的物料清单展开结果,如下:

image.png

        对比两张图可以得知,展开结果是一样的。


三、备注

       3.1  以上代码和结果示例都是在蓝海机械的测试账套中测试验证通过的,大家有蓝海机械测试环境的可以直接下载附件的SQL去执行即可得到结果。

        注意:附件中有两个SQL文件,分别实现子项半成品如果有多个BOM版本的话,是根据它最新的BOM版本来展开,还是根据父项产品BOM中所指定的子项BOM版本来展开。大家留意一下附件中的SQL文件的名称即可区分!

       3.2  虽然我提供的脚本是可以直接执行出结果的,但是建议大家,如果是有经常使用,或者是需要用到插件代码中,还是建议封装成存储过程或者函数会更方便一些,而且这样数据库引擎的查询执行效率会更高!


        至此,全文终。
        

赞 106