Как иерархическим запросом с соединением таблиц (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