Иерархические запросы DB2 z/OS
У меня есть таблица с двумя столбцами, PARENT_PART & CHILD_PART.
Мне нужны все связанные детали, если часть введена. Все дочерние части для этой части должны быть в результатах.
Parent part Child part
OABCDEFG01 OABCDEFG02
OABCDEFG01 OABCDEFG03
OABCDEFG02 OABCDEFG04
OABCDEFG02 OABCDEFG05
OABCDEFG03 OABCDEFG06
OABCDEFG03 OABCDEFG07
OABCDEFG03 OABCDEFG08
OABCDEFG04 OABCDEFG09
OABCDEFG04 OABCDEFG10
OABCDEFG05 OABCDEFG11
OABCDEFG05 OABCDEFG12
OABCDEFG06 OABCDEFG13
OABCDEFG07 OABCDEFG14
OABCDEFG07 OABCDEFG15
OABCDEFG07 OABCDEFG16
OABCDEFG07 OABCDEFG17
OABCDEFG08 OABCDEFG18
OABCDEFG08 OABCDEFG19
В соответствии с таблицей выше, если я дал PARENT-PART = 'OABCDEFG02'
РЕЗУЛЬТАТ ДОЛЖЕН БЫТЬ В СЛЕДУЮЩЕМ:
PARENT-PART CHILD-PART
OABCDEFG02 OABCDEFG04
OABCDEFG02 OABCDEFG05
OABCDEFG04 OABCDEFG09
OABCDEFG04 OABCDEFG10
OABCDEFG05 OABCDEFG11
OABCDEFG05 OABCDEFG12
Я использую DB2 для z/OS (система мэйнфреймов).
1 ответ
Для этого вам нужно так называемое "общее табличное выражение". Это рекурсивный запрос, который был добавлен к стандарту SQL и большинству систем баз данных для создания спецификации. У меня нет доступной DB2 for z/OS и я не могу ее протестировать, но вот ссылка на документацию с общими табличными выражениями, в т.ч. несколько примеров.
Ваш запрос будет выглядеть так:
WITH RPL (PART, CHILDPART) AS
( SELECT ROOT.PART, ROOT.CHILDPART
FROM PARTLIST ROOT
WHERE ROOT.PART = 'OABCDEFG02'
UNION ALL
SELECT CHILD.PART, CHILD.CHILDPART
FROM RPL PARENT, PARTLIST CHILD
WHERE PARENT.CHILDPART = CHILD.PART
)
SELECT DISTINCT PART, CHILDPART
FROM RPL
ORDER BY PART, CHILDPART