Для тех, кто должен решить эту проблему, используя Oracle 9i (или более раннюю версию), вам, вероятно, потребуется использовать SYS_CONNECT_BY_PATH, поскольку LISTAGG недоступен.
Чтобы ответить на OP, следующий запрос отобразит PID из таблицы A и объединит все столбцы DESC из таблицы B:
SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description
FROM (
SELECT a.pid, seq, description
FROM table_a a, table_b b
WHERE a.pid = b.pid(+)
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid
GROUP BY pid
ORDER BY pid;
Также могут быть случаи, когда все ключи и значения содержатся в одной таблице. Следующий запрос можно использовать, если нет таблицы A и существует только таблица B:
SELECT pid, SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER () OVER (PARTITION BY pid ORDER BY pid, seq) rnum, pid, description
FROM (
SELECT pid, seq, description
FROM table_b
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1 AND PRIOR pid = pid
GROUP BY pid
ORDER BY pid;
Все значения могут быть переупорядочены по желанию. Отдельные объединенные описания могут быть переупорядочены в предложении PARTITION BY, а список PID может быть переупорядочен в последнем предложении ORDER BY.
Альтернативно: могут быть случаи, когда вы хотите объединить все значения из всей таблицы в одну строку.
Ключевой идеей здесь является использование искусственного значения для группы описаний, которые будут объединены.
В следующем запросе используется постоянная строка «1», но любое значение будет работать:
SELECT SUBSTR (MAX (SYS_CONNECT_BY_PATH (description, ', ')), 3) all_descriptions
FROM (
SELECT ROW_NUMBER () OVER (PARTITION BY unique_id ORDER BY pid, seq) rnum, description
FROM (
SELECT '1' unique_id, b.pid, b.seq, b.description
FROM table_b b
)
)
START WITH rnum = 1
CONNECT BY PRIOR rnum = rnum - 1;
Отдельные объединенные описания могут быть переупорядочены в предложении PARTITION BY.
Несколько других ответов на этой странице также упоминали эту чрезвычайно полезную ссылку:
https://oracle-base.com/articles/misc/string-aggregation-techniques