Рекурсивные CTE для извлечения спецификации (спецификации) - PullRequest
0 голосов
/ 15 января 2019

Мне нужна помощь или указатель на CTE.
Я пытаюсь извлечь спецификацию, и я использовал запрос CTE. Запрос работает хорошо, и он вытягивает все данные. Моя борьба состоит в том, что во многих частях есть новые версии на разных уровнях, и я хочу получить только новые версии. В настоящее время мой запрос захватывает все. У меня есть столбец версии.
Я пробовал несколько разных вещей, таких как попытка использовать функцию max в CTE, но я получил ошибку, говоря group, поскольку не может быть частью рекурсивных ctes. Кроме того, я попытался использовать подзапрос, но я не получил правильный результат.

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 голосов
/ 18 января 2019

Я знаю, что не совсем понимаю вашу модель данных. Однако попробуйте заменить таблицы BOM и BomTable на производную таблицу, подобную этой, которая даст вам по одной строке для каждой записи Child с наибольшим значением 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 .

Noel

...