递归CTE提取BOM(物料清单)

时间:2019-01-15 14:59:48

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

我需要有关CTE的帮助或指导。
我正在尝试提取物料清单,并且使用了CTE查询。该查询工作良好,并且提取了所有数据。我的奋斗是有很多零件,其中零件具有不同级别的新版本,我只想获取新版本。目前,我的查询可以获取所有内容。我有一个版本专栏。
我尝试了几种不同的尝试,例如尝试在CTE中利用max函数,但是却遇到了一个错误,说不能通过归类cte进行分组。 另外,我尝试使用子查询,但没有得到正确的结果。

WITH BOM (
    Parent
    ,Child
    ,Qty
    ,Childrev
    ,LEVEL   
    ,sort
    )
AS (
    SELECT Parent
        ,cast(RTRIM(Child) AS NVARCHAR(max))
        ,Qty
        ,Childrev
        ,0 AS LEVEL
        ,cast(RTRIM(Child) AS NVARCHAR(max))
    FROM Bomtable

    UNION ALL

    SELECT BOM.Parent
        ,cast(RTRIM(Bomtable.Child) AS NVARCHAR(max))
        ,Bomtable.Qty
        ,BOM.Childrev
        ,LEVEL + 1
        ,CAST(BOM.Sort + '..... ' + RTRIM(Bomtable.Child) AS NVARCHAR(max))
    FROM BOM
    INNER JOIN Bomtable ON Bomtable.Parent = BOM.Child
    WHERE BOM.Parent = main product
    ORDER BY SORT
    )

1 个答案:

答案 0 :(得分:0)

我知道我不完全了解您的数据模型。但是,尝试用这样的派生表替换您的 BOM BomTable 表,这样将为每个具有Childrev值最大的子记录提供一行,而无需使用GROUP BY。

SELECT *
FROM   (
           SELECT *
                , ROW_NUMBER() OVER (PARTITION BY Child ORDER BY Childrev DESC) AS ROW_NBR
           FROM   BOM
       ) AS x
WHERE  x.ROW_NBR = 1;

这是OVER Clause的文档。

Noel