我需要构建一个递归循环来为我的数据库中的产品吐出产品结构/ BOM。
我有两个包含数据的主表。第一个是ps_mstr,它包含产品结构。该表中的主要字段是:
ps_par(父部件号) ps_comp(组件部件号) ps_qty_per(父级中的组件数量) ps_end_date(父级中组件的结束日期 - 这应该为NULL)
另一张表是pt_mstr。此表包含部件信息,链接可以位于ps_mstr表中的ps_par OR ps_comp之间。该表中的主要字段是:
pt_part(部件号) pt_pm_code(制造代码,P,M或L.我稍后会解释)。 pt_desc1(部分描述)
我们需要pt_mstr表的原因是因为我们需要向下钻取,直到达到pt_pm_code的'P'代码。 “P”以外的任何东西都是制造的部件。购买组件的'P'标准。
下图显示了1080003101的父件号。在此范围内,它消耗了几个组件。除了一个之外的所有都是'P'或购买的物品。对于一个'M'项目类型,我们需要向下钻取以展开此BOM。
以下是上面的1080003101和1080003099的深入分析:
在该深入研究中,我们发现有更多非'''类型的部件,因此我们需要继续向下钻取,直到我们获得所有'P'级别:
我尝试了几个递归循环,但无法得到我正在寻找的结果,并且正在寻求帮助。这是我目前正在尝试使用的代码:
USE QadMain;
GO
WITH PartBOM (ps_par, ps_comp, ps_qty_per, pt_pm_code, Level)
AS
(
-- Anchor part definition
SELECT ps.ps_par, ps.ps_comp, ps.ps_qty_per, pt.pt_pm_code, 0 As Level
FROM [QadMain].[dbo].[ps_mstr] ps
LEFT JOIN [QadMain].[dbo].[pt_mstr] pt ON pt.pt_part = ps.ps_comp
WHERE ps.ps_end IS NULL
UNION ALL
-- Recursive part definition
SELECT ps.ps_par, ps.ps_comp, ps.ps_qty_per, pt.pt_pm_code, Level + 1
FROM [QadMain].[dbo].[ps_mstr] ps
LEFT JOIN [QadMain].[dbo].[pt_mstr] pt ON pt.pt_part = ps.ps_comp
WHERE pt.pt_pm_code <> 'P' AND ps.ps_end IS NULL
)
-- Statement that executes the CTE
SELECT ps_par, ps_comp, ps_qty_per, pt_pm_code, Level
FROM PartBOM
GO
答案 0 :(得分:0)
递归CTE需要在定义的递归部分中进行自引用。这意味着,您需要加入PartBOM。没有它,你就得到了一个常规的CTE。