Pour ceux qui doivent résoudre ce problème à l'aide d'Oracle 9i (ou version antérieure), vous devrez probablement utiliser SYS_CONNECT_BY_PATH, car LISTAGG n'est pas disponible.
Pour répondre à l'OP, la requête suivante affichera le PID du tableau A et concaténera toutes les colonnes DESC du tableau 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;
Il peut également y avoir des cas où les clés et les valeurs sont toutes contenues dans une table. La requête suivante peut être utilisée lorsqu'il n'y a pas de table A et que seule la table B existe:
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;
Toutes les valeurs peuvent être réorganisées comme vous le souhaitez. Les descriptions concaténées individuelles peuvent être réorganisées dans la clause PARTITION BY, et la liste des PID peut être réorganisée dans la clause ORDER BY finale.
Alternativement: il peut arriver que vous souhaitiez concaténer toutes les valeurs d'une table entière en une seule ligne.
L'idée clé ici est d'utiliser une valeur artificielle pour le groupe de descriptions à concaténer.
Dans la requête suivante, la chaîne constante «1» est utilisée, mais toute valeur fonctionnera:
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;
Les descriptions concaténées individuelles peuvent être réorganisées dans la clause PARTITION BY.
Plusieurs autres réponses sur cette page ont également mentionné cette référence extrêmement utile:
https://oracle-base.com/articles/misc/string-aggregation-techniques