`
javayestome
  • 浏览: 1059106 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

使用临时表 + 循环展 BOM

阅读更多

背景

有如下的 BOM 表,parent_part child_part 是多对多的关系,现在要求查询出每个 child_part 的最顶层的 parent_part

CREATE TABLE pl_bom(

parent_part varchar(10),

child_part varchar(10))

INSERT INTO pl_bom

SELECT 'A','C' <place w:st="on"><span style="COLOR: blue">UNION</span></place> ALL

SELECT 'B','C' <place w:st="on"><span style="COLOR: blue">UNION</span></place> ALL

SELECT 'C','D' <place w:st="on"><span style="COLOR: blue">UNION</span></place> ALL

SELECT 'D','E' <place w:st="on"><span style="COLOR: blue">UNION</span></place> ALL

SELECT 'D','F' <place w:st="on"><span style="COLOR: blue">UNION</span></place> ALL

SELECT 'H','F'

即根据上述数据,应该得到如下结果

child_part parent_part

---------- -----------

C A

C B

D A

D B

E A

E B

F A

F B

F H

处理方法

一般可能会考虑从 child_part 开始扫描的方法。但对于每个 child_part 而言,它有一至多个 parent_part,对于多个parent_part 而言,每个 parent_part 到最顶部的 parent_part 经过的层数还可能不一致,这会导致扫描算法不太好写,而且同一个 parent_part 如果被多个 child_part 引用的话, 还可能导致重复的搜索此 parent_part 的顶 parent_part

下面的算法采用自 parent_part 反推 child_part 的方式,可以避免重复扫描某个 parent_part child_part 的问题

-- 使用自顶向下展开

-- 因为要删除数据, 所以不能用原始表, 用个临时表

SELECT

id = IDENTITY(int, 1,1 ), child_part, parent_part

INTO #

FROM pl_bom

-- 从顶往下展

DECLARE @Level int

SET @Level = 1

SELECT

id = id * 1, Level = @Level,

child_part, parent_part

INTO #re

FROM # A

WHERE NOT EXISTS(

SELECT * FROM #

WHERE child_part = A.parent_part)

WHILE @@ROWCOUNT > 0

BEGIN

SET @Level = @Level + 1

DELETE A

FROM # A, #re B

WHERE A.id = B.id

AND B.Level = @Level - 1

INSERT #re(

id, Level,

child_part, parent_part)

SELECT

A.id, @Level,

A.child_part, B.parent_part

FROM # A, #re B

WHERE A.parent_part = B.child_part

AND B.Level = @Level - 1

END

-- 显示结果

SELECT

child_part, parent_part

FROM #re

ORDER BY 1, 2

-- 删除临时表

DROP TABLE #re, #

分享到:
评论

相关推荐

    工程中BOM的实现代码: VB利用SQL(可以支持无限级BOM)

    2. **临时表的使用**:查询时,利用临时表来递归地获取各个层级的信息,实现无限级的BOM展示。 3. **临时表的清理**:查询完成后,删除临时表以释放资源。 #### 知识点四:使用VB.NET调用SQL Server进行BOM查询 在...

    U8 BOM全阶查询 sql

    - **层次查询**:使用自定义变量和循环结构实现层次查询,逐步展开全阶BOM信息。 - **条件过滤**:通过多表连接和复杂的`WHERE`子句条件过滤,确保查询结果的准确性。 - **性能优化**:每次查询只选取必要的列,减少...

    SAP PP BOM批量下载

    - **批量下载功能**:通过循环遍历物料清单,读取并存储BOM信息。 - **数据处理**:对获取到的BOM数据进行必要的处理,如过滤、排序等。 - **数据输出**:将处理后的数据输出为用户友好的格式,例如CSV或Excel文件。...

    U870产品培训-工程变更.ppt

    【U870产品培训-工程变更】是用友软件股份有限公司的一款专注于工程变更管理的系统,旨在帮助企业高效地管理工程物料清单(BOM)和工艺路线的变更过程,确保计划、生产和车间作业的顺利进行。以下是该产品的详细...

    医疗行业SAP实施成本会计培训教程.pptx

    SAP系统是一个广泛使用的企业管理软件,尤其在财务管理方面有着强大的功能。以下是教程中的核心知识点: 1. **成本会计简介**:成本会计是企业管理和决策的重要工具,它关注的是公司内部的成本计算和控制,包括直接...

Global site tag (gtag.js) - Google Analytics