PostgreSQL | Как найти повторяющиеся идентификаторы в двух столбцах?

PostgreSQL | Как найти повторяющиеся идентификаторы в двух столбцах?

Какие идентификаторы встречаются в двух столбцах?

У нас есть два набора идентификаторов. Это выглядит как два столбца таблицы.

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
Два набора столбцов идентификатором в PostgreSQL

Мы хотим найти все возможные пересечения между первым и вторым столбцами. Мы хотим знать какие идентификаторы есть, и в первом столбце, и во втором. Как это сделать?

 

Как найти пересечения между двумя наборами (столбцами) идентификаторов в 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]

Получили повторяющиеся идентификаторы по двум столбцам через INTERSECT в PostgreSQL
Получили повторяющиеся идентификаторы по двум столбцам через INTERSECT в PostgreSQL

Обратите внимание, что последовательность итоговых результатов пересечения перемешана в случайном порядке. Это происходит потому, что мы работаем с множествами, а не с упорядоченными элементами массивов.

В реальных таблицах вы будете получать столбцы идентификаторов также в виде множеств. Это внутренний механизм работы 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;

В результате получаем тот же самый набор записей, которые есть и в первом столбце, и во втором.

Получили повторяющиеся идентификаторы по двум столбцам через JOIN в PostgreSQL
Получили повторяющиеся идентификаторы по двум столбцам через JOIN в PostgreSQL

 

Информационные ссылки

Официальный сайт WEB-оболочки pgAdminhttps://www.pgadmin.org

Официальный сайт СУБД PostgreSQLhttps://www.postgresql.org

Команды SQLhttps://postgrespro.ru/docs/postgresql/15/sql-commands

Табличные выражения — https://postgrespro.ru/docs/postgresql/15/queries-table-expressions

Сочетания запросов — https://postgrespro.ru/docs/postgresql/15/queries-union