来自BOM表的递归SQL查询



我正试图从顶级开始提取产品制造中使用的所有组件,并试图开发递归查询。经过搜索,我找不到类似的东西。关键字段为:

  • 项目这是正在生成的项目的部件号
  • 组件这是正在使用的组件的部件号
  • 类型用于定义组件类型。已购买=0或子组件=2

如果零部件是子部件,我希望将子部件零部件添加到列表中(而不是子部件零件号)。如果这些组件中的任何一个本身就是子组件、repeat等。我有顶级列表,但无法确定如何进行递归——我能找到的所有示例都有不同于我的2的多个级别,并且需要循环。到目前为止,这是我的代码。我在SQL方面相对来说是个新手。

WITH FullBom (item, comp, type) AS
(
SELECT item, comp, ref
FROM dbBOM
WHERE item = 'A Constant' AND type = 0
UNION ALL
SELECT d.item, d.comp, d.ref
FROM dbBOM d, FullBom FB
WHERE d.comp = FB.item
)
SELECT * FROM FullBom

样本数据

Item    Comp't  Type
Part1   Part2   0
Part1   Part3   0
Part1   Part4   2
Part1   Part10  2
Part1   Part11  2
Part1   …
Part4   Part5   0
Part4   Part2   0
Part4   Part6   2
Part4   Part22  2
Part4   Part23  2
Part4   …
Part6   Part7   0
Part6   Part8   0   
Part6   …

此数据的输出

Comp't  Location
Part2   Part1
Part3   Part1
Part5   Part4
Part2   Part4
Part7   Part6
Part8   Part6
...
Partxx  Part10
...
Partxx  Part11
...

我已经用准代码格式重新构造了我的查询,以尝试&展示重新进入的结构。我希望这可能有助于展示我正在努力实现的目标。我正在尝试重新生成我们以前数据库中的管理报告等。

Define Value as text array
Define Int as integer
Order by Item + Type ascending
                                        --Set start values
Value[1] = ‘SearchValue’
Int = 1
Find first record key ‘Value[1] + 0’
Gosub FindLoop
End
FindLoop:
While Item = Value[Int] 
    If Type = 0 then 
        Output data string
    Else Type = 2
        Int = Int + 1
        Value[Int] = Component       --Set Component as search value
        Gosub FindLoop               --Reentrant use of loop
        Int = Int – 1                --Restores previous search value
    End If
    Find Next key ‘Value + Type’
Next
Return

非常感谢您的意见。我希望我的分析更好

由于我不知道在任何程序集中会找到多少子程序集,也不知道在子程序集中会有多少个子程序集,因此递归查询似乎是最好的方法。我可以使用Select,但前提是任何级别的子程序集都有固定的限制。由于没有限制,一旦代码看到Type=2,它就需要开始挖掘,直到它结束,然后循环回来,等等。

您正在以与应该的方式相反的方式进行联接。

递归CTE的第一部分是锚,递归的基础,第二部分是递归。

对于锚点,由于我们没有额外的字段来了解一个项目是否可以是最终产品或仅是组件,如果您是最终产品的信息过滤器,我们会接受所有内容。项目的条件应在CTE之外。

SELECT item, SubItem, [type], item AS FinalItem
FROM   dbBOM

FinalItem将始终是已完成项目的名称,并添加为在主查询中用作筛选器。

查询的递归部分将是

SELECT d.item, d.SubItem, d.[type], FB.FinalItem
FROM   FullBom FB
       Inner Join dbBOM d ON d.Item = FB.Subitem AND FB.[type] = 2

对于已经存在的每一行,应该进行组装([type] = 2),获取与FullBOM中的子项相对应的项,将它们添加到FullBOM中,并对新项重复此操作。

FinalItem在每一级递归中都将保持不变,因为我们从FullBOM中读取它。

从中取出你需要的FinalItem,只取出不需要子组件的项目([type] = 0),你就会得到

WITH FullBom (item, SubItem, [type], FinalItem) AS
(     
  SELECT item, SubItem, [type], item AS FinalItem
  FROM   dbBOM 
  UNION ALL
  SELECT d.item, d.SubItem, d.[type], FB.FinalItem
  FROM   FullBom FB
         Inner Join dbBOM d ON d.Item = FB.Subitem AND FB.[type] = 2
)
SELECT subItem, Item
FROM   FullBom
WHERE  FinalItem= 'Part1'
  AND  [type] = 0

相关内容

  • 没有找到相关文章

最新更新