У нас есть три таблицы: «ПОЛЬЗОВАТЕЛИ», «КОМПАНИИ» и «ФАЙЛЫ», где у каждого ПОЛЬЗОВАТЕЛЯ есть вариант столбца с именем: «COMAPNY_IDS», который представляет собой простой массив, который соответствует записям в таблице «КОМПАНИИ».
Каждый ФАЙЛ принадлежит одной КОМПАНИИ через поле «COMPANY_ID».
Мы хотели бы присоединить каждого ПОЛЬЗОВАТЕЛЯ к каждому из ФАЙЛОВ, к которым он подключен через любую из КОМПАНИЙ, с которыми он связан.
Это наивное решение:
SELECT u._id as user_id, z._id as file_id, z.SENT_ON
FROM users u,
LATERAL (SELECT f._id, f.SENT_ON
from FILES f
where ( ARRAY_CONTAINS(TO_VARIANT(f.COMPANY_ID), TO_ARRAY(u.COMPANY_IDS)))) z
Принимает вечно и никогда не кончает.
Более замысловатое решение, в котором не используется функция "ARRAY_CONTAINS" - оно заканчивается за полторы секунды:
SELECT u._id as user_id, max(files.sent_on)
FROM users u
LEFT JOIN (
select *
FROM companies c,
lateral (select flt.value as cid , us._id as uid
from users us,
lateral flatten ( company_ids) as flt
where cid = c._id) ccc
) x on (x.uid = u._id)
LEFT JOIN files
on x.cid = files.company_id
GROUP BY u._id
Есть ли что-то, препятствующее правильному использованию ARRAY_CONTAINS в предложениях "ON" или как часть предложения "ГДЕ" связанных боковых подзапросов?