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.