В sql запросе заменить IN на JOIN

Помогите пожалуйста, как можно написать этот запрос, чтобы заменить операторы IN на JOIN и получить тот же результат из БД? И почему такие запросы лучше писать через JOIN?

select v
from cbas_Verification v
where v.type = verificationType
  and v.id in (select distinct b.verificationId from cbas_batch b where b.verificationStep <> 'FINISH')
  and v.id not in (select m.verificationId from cbas_ExchangeMessages m);

Ответы (1 шт):

Автор решения: Akina

Поскольку поля таблиц из подзапросов не нужны, разумнее переписывать WHERE [NOT] IN не на JOIN, а на WHERE [NOT] EXISTS:

SELECT v
FROM cbas_Verification v
WHERE v.type = verificationType
  AND EXISTS (SELECT NULL 
              FROM cbas_batch b 
              WHERE b.verificationStep <> 'FINISH' 
                AND b.verificationId = v.id)
  AND NOT EXISTS (SELECT NULL 
                  FROM cbas_ExchangeMessages m 
                  WHERE m.verificationId = v.id);

Во-первых, отпадает надобность в DISTINCT.

Во-вторых, не будет проблем с дублированием записей.

→ Ссылка