oracleでは複数レコードの値を1レコードにまとめる際に
LISTAGG関数という便利なものがあります
SQL>SELECT * FROM table;
col1 col2
----- --------
key1 val1-1
key1 val1-2
key1 val1-3
SQL>
SELECT col1,
LISTAGG(col2, '|') WITH IN GROUP(order by col2) list
FROM table
GROUP BY col1;
col1 list
----- ---------
key1 val1-1|val1-2|val1-3
ただし、集計するレコード対象が多く、結合結果が4000バイトを超えると
以下のエラーとなってしまいます。
ORA-01489: result of string concatenation is too long
このためLISTAGG関数を用いる際に4000バイト文字を超える恐れがある場合は
XMLAGG関数を用いた方がいいみたいです。
SQL>
SELECT col1,
RTRIM(XMLAGG(XMLELEMENT(e,col2,'|').EXTRACT('//text()')).GetClobVal(),'|') AS list
FROM table
GROUP BY
col1;
col1 list
----- -----
key1 val1-1|val1-2|val1-3