Замечена нами в Oracle 11.2, вот ссылка на документацию:
docs.oracle.com/cd/E14072_01/server.112/e10592/functions087.htm
Позволяет вывести список значений поля с разделителями в рамках условия группировки с сортировкой.
Пример использования с GROUP BY, предполагается, что у вас есть возможность читать системные объекты, в данном случае используется view DBA_TABLES:
SELECT table_name, LISTAGG(index_name, '; ') WITHIN GROUP (ORDER BY index_name) AS index_list FROM dba_indexes WHERE table_owner = 'SYS' GROUP BY table_name HAVING COUNT(*) > 1
Результаты будут выглядеть примерно так:
Если у вас имеется два набора с отношением «один — ко многим», то решение нам видится так:
SELECT tbl.table_name, ind.index_list FROM dba_tables tbl, ( SELECT table_name, LISTAGG(index_name, '; ') WITHIN GROUP (ORDER BY index_name) AS index_list FROM dba_indexes WHERE table_owner = 'SYS' GROUP BY table_name ) ind WHERE tbl.owner = 'SYS' AND tbl.table_name = ind.table_name
Пример использования в обычном запросе, как аналитической функции:
SELECT table_name, LISTAGG(index_name, '; ') WITHIN GROUP (ORDER BY index_name) OVER (PARTITION BY table_name) AS index_list FROM dba_indexes WHERE table_owner = 'SYS'