Для тих, хто повинен вирішити цю проблему за допомогою Oracle 9i (або раніше), вам, ймовірно, потрібно буде використовувати SYS_CONNECT_BY_PATH, оскільки LISTAGG недоступний.
Щоб відповісти на ОП, наступний запит відобразить 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;
Також можуть бути випадки, коли ключі та значення містяться в одній таблиці. Наступний запит можна використовувати там, де немає Таблиці А, і існує лише Таблиця 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