Для проверки принадлежности массивов из одной таблицы массивам в другой в SQL можно использовать операторы JOIN и ARRAY_AGG.
Предположим, у нас есть две таблицы:
CREATE TABLE table1 ( id INT PRIMARY KEY, array1 INT[] ); CREATE TABLE table2 ( id INT PRIMARY KEY, array2 INT[] );
И мы хотим проверить, принадлежит ли каждый массив из таблицы table1 хотя бы одному массиву из таблицы table2.
Мы можем сделать это, используя операторы JOIN и ARRAY_AGG в следующем запросе:
SELECT table1.id, table1.array1, ARRAY_AGG(DISTINCT table2.array2) AS arrays_in_table2 FROM table1 LEFT JOIN table2 ON table1.array1 @> table2.array2 -- проверяем, что array1 содержит array2 GROUP BY table1.id, table1.array1;
В результате запроса мы получим таблицу с тремя столбцами: id из таблицы table1, array1 из таблицы table1 и arrays_in_table2, в котором будет содержаться массив уникальных значений array2, который принадлежит массиву array1.
Теперь мы можем проверить, содержит ли массив arrays_in_table2 элементы массива array1, добавив условие в WHERE:
SELECT id, array1, arrays_in_table2 FROM ( SELECT table1.id, table1.array1, ARRAY_AGG(DISTINCT table2.array2) AS arrays_in_table2 FROM table1 LEFT JOIN table2 ON table1.array1 @> table2.array2 GROUP BY table1.id, table1.array1 ) AS subquery WHERE arrays_in_table2 @> array1; -- проверяем, что arrays_in_table2 содержит array1
В результате этого запроса получим только те строки, где array1 из таблицы table1 принадлежит хотя бы одному массиву в arrays_in_table2.