DB2 CTE Рекурсия на одну таблицу, 6 уровней - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужно написать рекурсию для таблицы db2, которая содержит отношения родитель / потомок в значениях столбцов.это ужасный дизайн, но, к сожалению, я не могу это контролировать.Это дамп данных из SalesForce.

Каждая запись в таблице дампа представляет уровень группировки кода продукта.Начиная с верхнего уровня Indutstrial, AG, OIL и т. Д., Каждая группа имеет подгруппы с кодами групп до достижения нижнего уровня, который содержит фактический код продукта.Учитывая код продукта (STCC_RECORD_ID), мне нужно получить GROUP_CODE верхнего родителя.Я застрял, любая оценка будет принята с благодарностью.Вот моя последняя версия SQL:

WITH X(ID,STCC_RECORD_ID,PARENT_ID,GROUP_CODE,SEG_NAME) AS 
(
SELECT P.ID,P.STCC_RECORD_ID,P.PARENT_ID,P.GROUP_CODE,P.SEG_NAME
        FROM HB_EXTRACT.SEGMENTATION P
        WHERE STCC_RECORD_ID='0113211' 
UNION ALL
SELECT ID,STCC_RECORD_ID,PARENT_ID,GROUP_CODE,SEG_NAME
        FROM x
        WHERE x.PARENT_ID = ID
) 
SELECT * FROM X

Вот вывод из этого.Только нижняя запись показывает: enter image description here

Это желаемый результат: enter image description here

1 Ответ

0 голосов
/ 20 ноября 2018

Как я понимаю, вы должны использовать восходящий подход.

WITH X(ID,STCC_RECORD_ID,PARENT_ID,GROUP_CODE,SEG_NAME, Level) AS 
(
SELECT P.ID,P.STCC_RECORD_ID,P.PARENT_ID,P.GROUP_CODE,P.SEG_NAME, 0
        FROM HB_EXTRACT.SEGMENTATION P
        WHERE STCC_RECORD_ID='0113211' 
UNION ALL
SELECT P.ID,P.STCC_RECORD_ID,P.PARENT_ID,P.GROUP_CODE,P.SEG_NAME, Level+1
        FROM x, HB_EXTRACT.SEGMENTATION P
        WHERE x.STCC_RECORD_ID=P.PARENT_ID
        AND Level<7
) 
SELECT * FROM X
WHERE Level>4

В каждой итерации вы присоединяетесь к следующему уровню (родительскому) на основе текущей записи.Столбец уровня используется для последующего выбора определенного слоя таблицы X.

...