Попытка объединения таблиц с помощью ARRAY_CONTAINS приводит к бесконечному запуску - PullRequest
1 голос
/ 04 марта 2020

У нас есть три таблицы: «ПОЛЬЗОВАТЕЛИ», «КОМПАНИИ» и «ФАЙЛЫ», где у каждого ПОЛЬЗОВАТЕЛЯ есть вариант столбца с именем: «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" или как часть предложения "ГДЕ" связанных боковых подзапросов?

...