Это типичный иерархический запрос Oracle.
Для начала рассмотрим следующий запрос, который возвращает всех родителей записи, чье col2
имеет значение 'E'
:
select col1, col2, level
from mytable
start with col2 = 'E'
connect by prior col1 = col2;
Возвращает:
COL1 | COL2 | LEVEL
:--- | :--- | ----:
D | E | 1
C | D | 2
B | C | 3
A | B | 4
Теперь мы можем превратить это в подзапрос и использовать статистическую функцию LISTAGG()
для получения ожидаемого результата:
select listagg(case when lvl = 1 then col2 || ',' end || col1, ',')
within group(order by lvl) seq
from (
select col1, col2, level lvl
from mytable
start with col2 = 'E'
connect by prior col1 = col2
) x;
| SEQ |
| :-------- |
| E,D,C,B,A |
Демонстрация на DB Fiddle