intagg
Агрегатор и нумератор целых чисел.
Схема размещения:
ext
.Модуль предоставляет агрегатор и нумератор целых чисел. Он считается устаревшим, поскольку существуют встроенные функции с более широкими возможностями. Однако продолжает существовать как набор оболочек встроенных функций для обратной совместимости.
Функции модуля:
Тип функции | Функция | Результат | Описание | Оболочка |
---|---|---|---|---|
Агрегатор | int_array_aggregate (integer) | integer[] – массив целых чисел | Функция выдает массив целых чисел, который содержит переданные ей числа | Оболочка встроенной функции array_agg , которая делает то же самое для массива любого типа |
Нумератор | int_array_enum (integer[]) | setof integer , возвращает набор целых чисел | Функция возвращает набор целых; действие обратно действию агрегатора: получив массив целых, он разворачивает его в набор строк | Оболочка функции unnest , которая делает то же самое для массива любого типа |
Таблица соотношений «один-ко-многим» обычно находится между двумя индексированными таблицами, например:
-- создать таблицы 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;
Пример результата запроса:
Раскрыть type=sqlid | name ----+-------------- 2 | Second Right 3 | Third Right 4 | Fourth (3 rows)
Другой способ:
SELECT lefti, righti FROM one_to_many WHERE lefti = 1;
Пример результата запроса:
Раскрыть type=sqllefti | 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;
Пример результата запроса:
Раскрыть type=sqllefti | int_array_enum -------+---------------- 1 | 2 1 | 3 1 | 4 (3 rows)
Дополнительную информацию по поставляемому модулю intagg можно получить по ссылке.