我正试图从顶级开始提取产品制造中使用的所有组件,并试图开发递归查询。经过搜索,我找不到类似的东西。关键字段为:
- 项目这是正在生成的项目的部件号
- 组件这是正在使用的组件的部件号
- 类型用于定义组件类型。已购买=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