Рекурсивный CTE в SQL для замены фантомных сборок в спецификации - PullRequest
0 голосов
/ 15 мая 2019

Я построил рекурсивный CTE, чтобы взорвать мой список материалов, но во многих элементах есть «фантомные» части в списке материалов.Мне нужно заменить «фантомные» предметы их ведомостью материалов.Призрачные предметы - это не настоящие предметы, а способ, которым мы группируем набор предметов.Некоторые фантомные предметы также построены с другими фантомными предметами, поэтому он должен быть рекурсивным.

Я пытался просто заменить фантомные элементы соединением с самой таблицей, но столкнулся с проблемами, когда есть фантомные элементы, состоящие из других фантомных элементов

SELECT
    c.TopLevelItem,
    c.ItemPath,
    c.ParentItem,
    ComponentItem = x.ComponentItem,
    ComponentQuantity = x.ComponentQuantity,
    c.ComponentItemLevel
FROM KOG_Datamart.dim.CurrentProductStructure c
    LEFT JOIN
        (
            SELECT
                ParentItem,
                ComponentItem,
                ComponentQuantity
            FROM KOG_Datamart.dim.CurrentProductStructure
                JOIN dim.Items i
                    ON TopLevelItem = i.ItemNumber
            WHERE
                i.ItemClass = 'phantom'
                AND ParentItem <> ComponentItem
            GROUP BY
                ParentItem,
                ComponentItem,
                ComponentQuantity
        ) x
        ON x.ParentItem = c.ParentItem
WHERE
    x.ParentItem IS NOT NULL
    AND c.ParentItem <> c.ComponentItem

ПосколькуПриведенный выше код будет дублировать элементы с несколькими фантомами, я думаю, что мне нужно будет использовать рекурсивный cte для замены всех фантомов, но я довольно новичок в рекурсии.

Я перечислил ссылку ниже текущего состояния, примерсписок фантомных предметов и будущее состояние в документе Google, любая помощь будет оценена!

https://docs.google.com/spreadsheets/d/1ju0p1TWJcTksl4wL-btRfHmwQ5TV6a_m7wencFFAngw/edit?usp=sharing

...