SQL递归循环(产品结构/ BOM)

时间:2018-03-08 19:56:17

标签: sql sql-server common-table-expression recursive-query

我需要构建一个递归循环来为我的数据库中的产品吐出产品结构/ 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。

enter image description here

以下是上面的1080003101和1080003099的深入分析:

enter image description here

在该深入研究中,我们发现有更多非'''类型的部件,因此我们需要继续向下钻取,直到我们获得所有'P'级别:

enter image description here

我尝试了几个递归循环,但无法得到我正在寻找的结果,并且正在寻求帮助。这是我目前正在尝试使用的代码:

    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

1 个答案:

答案 0 :(得分:0)

递归CTE需要在定义的递归部分中进行自引用。这意味着,您需要加入PartBOM。没有它,你就得到了一个常规的CTE。