intagg. Агрегатор и нумератор целых чисел#

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

Модуль предоставляет агрегатор и нумератор целых чисел.

Примечание:

Модуль intagg считается устаревшим, поскольку существуют встроенные функции с более широкими возможностями. Однако модуль intagg продолжает существовать как набор оболочек встроенных функций для обратной совместимости.

Функции модуля:

Тип функции

Функция

Результат

Описание

Оболочка

Агрегатор

int_array_aggregate (integer)

integer[] – массив целых чисел

Функция выдает массив целых чисел, который содержит переданные ей числа

Оболочка встроенной функции array_agg, которая делает то же самое для массива любого типа

Нумератор

int_array_enum (integer[])

setof integer, возвращает набор целых чисел

Функция возвращает набор целых; действие обратно действию агрегатора: получив массив целых, он разворачивает его в набор строк

Оболочка функции unnest, которая делает то же самое для массива любого типа

Доработка#

Доработка не проводилась.

Ограничения#

Ограничения отсутствуют.

Установка#

При наличии прав администратора СУБД включение модуля возможно выполнить вручную:

CREATE EXTENSION intagg SCHEMA ext;

Настройка#

Настройка не требуется.

Использование модуля#

Таблица соотношений «один-ко-многим» обычно находится между двумя индексированными таблицами, например:

-- создать таблицы
CREATE TABLE lefti (id INT PRIMARY KEY, name text);
CREATE TABLE righti (id INT PRIMARY KEY, name text);
CREATE TABLE one_to_many (lefti INT REFERENCES lefti, righti INT REFERENCES righti);
-- заполнить таблицы тестовыми данными
INSERT INTO lefti VALUES (1,'First Left');
INSERT INTO lefti VALUES (2,'Second Left');
INSERT INTO lefti VALUES (3,'Third Left');
INSERT INTO lefti VALUES (4,'Fourth');
INSERT INTO righti VALUES (1,'First Right');
INSERT INTO righti VALUES (2,'Second Right');
INSERT INTO righti VALUES (3,'Third Right');
INSERT INTO righti VALUES (4,'Fourth');
INSERT INTO one_to_many VALUES (1,2);
INSERT INTO one_to_many VALUES (1,3);
INSERT INTO one_to_many VALUES (1,4);
INSERT INTO one_to_many VALUES (2,2);

Запрос вернет все элементы из таблицы справа для записи 1 в таблице слева:

SELECT righti.* from righti JOIN one_to_many ON (righti.id = one_to_many.righti)
  WHERE one_to_many.lefti = 1;
SELECT lefti, righti FROM one_to_many WHERE lefti = 1;

Пример результата запроса:

 id |     name     
----+--------------
  2 | Second Right
  3 | Third Right
  4 | Fourth
(3 rows)

Другой способ:

SELECT lefti, righti FROM one_to_many WHERE lefti = 1;

Пример результата запроса:

 lefti | righti 
-------+--------
     1 |      2
     1 |      3
     1 |      4
(3 rows)

Создание сводной таблицы с применением агрегатора int_array_aggregate, которая содержит одну строку для каждого элемента слева с массивом элементов справа:

CREATE TABLE summary AS
  SELECT lefti, int_array_aggregate(righti) AS righti
  FROM one_to_many
  GROUP BY lefti;

Запрос с вызовом нумератора int_array_enum:

SELECT lefti, int_array_enum(righti) FROM summary WHERE lefti = 1;

Пример результата запроса:

 lefti | int_array_enum 
-------+----------------
     1 |              2
     1 |              3
     1 |              4
(3 rows)

Ссылки на документацию разработчика#

Исходная документация PosgreSQL по модулю intagg: https://www.postgresql.org/docs/15/intagg.html.