В 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.
Во-вторых, не будет проблем с дублированием записей.