Per coloro che devono risolvere questo problema utilizzando Oracle 9i (o precedente), sarà probabilmente necessario utilizzare SYS_CONNECT_BY_PATH, poiché LISTAGG non è disponibile.
Per rispondere all'OP, la seguente query visualizzerà il PID dalla tabella A e concatenerà tutte le colonne DESC dalla tabella 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;
Ci possono anche essere casi in cui chiavi e valori sono tutti contenuti in una tabella. La seguente query può essere utilizzata in assenza della tabella A ed esiste solo la tabella 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;
Tutti i valori possono essere riordinati come desiderato. Le descrizioni concatenate individuali possono essere riordinate nella clausola PARTITION BY e l'elenco dei PID può essere riordinato nella clausola ORDER BY finale.
In alternativa: potrebbero esserci momenti in cui si desidera concatenare tutti i valori di un'intera tabella in una riga.
L'idea chiave qui sta usando un valore artificiale per il gruppo di descrizioni da concatenare.
Nella query seguente, viene utilizzata la stringa costante '1', ma qualsiasi valore funzionerà:
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;
Le descrizioni concatenate individuali possono essere riordinate nella clausola PARTITION BY.
Diverse altre risposte in questa pagina hanno anche menzionato questo riferimento estremamente utile:
https://oracle-base.com/articles/misc/string-aggregation-techniques