15.04.2013


Аналитическая функция LISTAGG — получение списка значений колонки при группировке


Категории: SQL — Administrator

Замечена нами в 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'  




Календарь


Архив