Какие идентификаторы встречаются в двух столбцах?
У нас есть два набора идентификаторов. Это выглядит как два столбца таблицы.
SELECT unnest(ARRAY[1,2,3,4,5,6,7,8,9]); SELECT unnest(ARRAY[5,6,7,8,9,10,11,12,13]);
Я столбцы называю словом «набор», потому что каждый элемент столбца уникален.
Мы хотим найти все возможные пересечения между первым и вторым столбцами. Мы хотим знать какие идентификаторы есть, и в первом столбце, и во втором. Как это сделать?
Как найти пересечения между двумя наборами (столбцами) идентификаторов в PostgreSQL через оператор INTERSECT?
Я записал SQL-команды в виде преобразований массивов в столбцы таблицы, чтобы было понятнее. По сути это любые столбцы с ID целочисленных первичных ключей.
Для пересечения мы будем использовать один из операторов «сочетания запросов». Нам понадобится оператор INTERSECT.
Полная SQL-команда для пересечения множеств будет выглядеть так:
-- Пересечение через INTERSECT SELECT unnest(ARRAY[1,2,3,4,5,6,7,8,9]) INTERSECT SELECT unnest(ARRAY[5,6,7,8,9,10,11,12,13]);
В результате мы получим новый столбец: [8, 9, 7, 5, 6]
Обратите внимание, что последовательность итоговых результатов пересечения перемешана в случайном порядке. Это происходит потому, что мы работаем с множествами, а не с упорядоченными элементами массивов.
В реальных таблицах вы будете получать столбцы идентификаторов также в виде множеств. Это внутренний механизм работы PostgreSQL, который вы изменить не можете. Это сделано для ускорения работы системы.
Как найти пересечения между двумя наборами (столбцами) идентификаторов в PostgreSQL через команду JOIN?
Ту же самую задачу по пересечению двух столбцов можно выполнить через предложение JOIN.
-- Пересечение через JOIN SELECT e FROM (SELECT unnest(ARRAY[1,2,3,4,5,6,7,8,9]) AS e) AS q JOIN (SELECT unnest(ARRAY[5,6,7,8,9,10,11,12,13]) AS r) AS w ON q = w;
В результате получаем тот же самый набор записей, которые есть и в первом столбце, и во втором.
Информационные ссылки
Официальный сайт WEB-оболочки pgAdmin — https://www.pgadmin.org
Официальный сайт СУБД PostgreSQL — https://www.postgresql.org
Команды SQL — https://postgrespro.ru/docs/postgresql/15/sql-commands
Табличные выражения — https://postgrespro.ru/docs/postgresql/15/queries-table-expressions
Сочетания запросов — https://postgrespro.ru/docs/postgresql/15/queries-union