递归CTE从总迭代中获取父级

时间:2017-10-12 16:52:02

标签: sql common-table-expression

我有一个递归的CTE,我打印出一份物料清单。此CTE适用于此目的,但我想添加的是所有项目的另一列,以显示顶级父级。

以下是我目前的结果:

 ITEM               COMPONENT       LEVEL
 2326123679         216501          1
 2326123679         80015008        1
 216501             10006           2
 216501             13004           2
 216501             21010           2

我想从CTE输出的内容是:

 PARENT             ITEM            COMPONENT       LEVEL
 2326123679         2326123679      216501          1
 2326123679         2326123679      80015008        1
 2326123679         216501          10006           2
 2326123679         216501          13004           2
 2326123679         216501          21010           2

这是否可能使用递归CTE?基本上我想输出:

 MAX(ITEM)

在每次完整的迭代中。

CTE:

 WITH ReturnBOM ([Item], [Item Name], [Component],  Level)
 AS
 (
 SELECT  
        FinishedLevel.PMPRNO AS [Item],
        MasterItem.MMITDS AS [Item Name],
        FinishedLevel.PMMTNO  AS [Component],   
        1 AS Level
FROM    M3FDBPRD.MVXJDTA.MPDMAT  FinishedLevel
JOIN    M3FDBPRD.MVXJDTA.MITMAS  MasterItem
ON      FinishedLevel.PMPRNO = MasterItem.MMITNO
WHERE   MasterItem.MMITTY = 'Z10'
UNION ALL
    SELECT

        FinishedLevel.PMPRNO AS [Item],
        MasterItem.MMITDS AS [Item Name],
        FinishedLevel.PMMTNO  AS [Component],   
        Level + 1
FROM    M3FDBPRD.MVXJDTA.MPDMAT  FinishedLevel
INNER JOIN ReturnBOM  ItemRecursion
ON      ItemRecursion.[Component] = FinishedLevel.PMPRNO
JOIN    M3FDBPRD.MVXJDTA.MITMAS  MasterItem
ON      FinishedLevel.PMPRNO = MasterItem.MMITNO

 )
 SELECT 
 ReturnBOM.Item,
 ReturnBOM.[Item Name],
 ReturnBOM.Component,
 ReturnBOM.Level
 FROM ReturnBOM

1 个答案:

答案 0 :(得分:2)

没有数据来测试这个,我认为这应该非常简单:

 WITH ReturnBOM (Parent, [Item], [Item Name], [Component],  Level)
 AS
 (
 SELECT  
        FinishedLevel.PMPRNO AS [Parent],
        FinishedLevel.PMPRNO AS [Item],
        MasterItem.MMITDS AS [Item Name],
        FinishedLevel.PMMTNO  AS [Component],   
        1 AS Level
FROM    M3FDBPRD.MVXJDTA.MPDMAT  FinishedLevel
JOIN    M3FDBPRD.MVXJDTA.MITMAS  MasterItem
ON      FinishedLevel.PMPRNO = MasterItem.MMITNO
WHERE   MasterItem.MMITTY = 'Z10'
UNION ALL
    SELECT
        ItemRecursion.Parent,
        FinishedLevel.PMPRNO AS [Item],
        MasterItem.MMITDS AS [Item Name],
        FinishedLevel.PMMTNO  AS [Component],   
        Level + 1
FROM    M3FDBPRD.MVXJDTA.MPDMAT  FinishedLevel
INNER JOIN ReturnBOM  ItemRecursion
ON      ItemRecursion.[Component] = FinishedLevel.PMPRNO
JOIN    M3FDBPRD.MVXJDTA.MITMAS  MasterItem
ON      FinishedLevel.PMPRNO = MasterItem.MMITNO

 )
 SELECT 
 ReturnBOM.Parent,
 ReturnBOM.Item,
 ReturnBOM.[Item Name],
 ReturnBOM.Component,
 ReturnBOM.Level
 FROM ReturnBOM;
相关问题