Как иерархическим запросом с соединением таблиц (JOIN) конкатенировать значение колонки?

Имею две таблицы (создание таблиц и данные):

DAT      A        B        ID       NUM      PART    
-------- -------- -------- -------- -------- --------
1234     aa       bb       None     0        0       
1235     ab       ba       8b       2        2       
1238     ab       ba       8b       1        2       

DAT      TST     
-------- --------
1234     ss tr rt
1235     ab rt   
1238     er ty ui

На выходе пытаюсь получить следующую таблицу:

 a   b   res
 --  --  ---------------
 aa  bb  ss tr rt
 ab  ba  er ty ui ab rt

Пытаюсь объединить таблицы по колонке dat, затем пытаюсь склеить ячейки для колонки tst, где:

  • part - количество частей
  • num - номер части
  • id - id склейки.

Примерно следующим образом пытаюсь склеивать и выполнить конкатенацию:

select a, b,
    REPLACE(SYS_CONNECT_BY_PATH(tst, '*&^%'),'*&^%') AS res
from(
    select dat, a, b, id, num, part from one
) C
left join two t1 on t1.dat = c.dat
WHERE CONNECT_BY_ISLEAF = 1
START WITH NUM = 1
CONNECT BY PRIOR a = a
AND PRIOR B = B
AND PRIOR ID = ID
AND PRIOR PART = part - 1

Просьба, подсказать оптимальный и более быстрый по исполнению вариант. Возможно ли выполнить подобный запрос без UNION с добавлением строк где id является None.


Ответы (1 шт):

Автор решения: 0xdb

Не стоит использовать иерархические запросы там, где иерархии нету.

Такой простой запрос на данных из вопроса вернёт ожидаемый результат:

select 
    a, b, id, listagg (tst, ' ') within group (order by num asc) res
from one t1
join two t2 on t2.dat = t1.dat
group by a, b, id

A        B        ID       RES             
-------- -------- -------- ----------------
aa       bb       None     ss tr rt        
ab       ba       8b       er ty ui ab rt  
→ Ссылка