Para aqueles que precisam resolver esse problema usando o Oracle 9i (ou anterior), provavelmente será necessário usar o SYS_CONNECT_BY_PATH, pois o LISTAGG não está disponível.
Para responder ao OP, a seguinte consulta exibirá o PID da Tabela A e concatenará todas as colunas DESC da Tabela 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;
Também pode haver casos em que chaves e valores estão todos contidos em uma tabela. A consulta a seguir pode ser usada onde não há Tabela A e existe apenas a Tabela 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;
Todos os valores podem ser reordenados conforme desejado. Descrições concatenadas individuais podem ser reordenadas na cláusula PARTITION BY e a lista de PIDs pode ser reordenada na cláusula ORDER BY final.
Como alternativa: pode haver momentos em que você deseja concatenar todos os valores de uma tabela inteira em uma linha.
A idéia principal aqui é usar um valor artificial para o grupo de descrições a serem concatenadas.
Na consulta a seguir, a cadeia constante '1' é usada, mas qualquer valor funcionará:
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;
Descrições concatenadas individuais podem ser reordenadas na cláusula PARTITION BY.
Várias outras respostas nesta página também mencionaram essa referência extremamente útil:
https://oracle-base.com/articles/misc/string-aggregation-techniques