Иерархические запросы 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
Другие вопросы по тегам