Как улучшить выбор с не в Firebird
select mid from aplicacao
where mid not in
(
select distinct mid from aplicacao
inner join prod_app on prod_app.mid=aplicacao.mid
where prod_app.coditem=1
)
Я пытаюсь найти решение для Firebird, чтобы улучшить этот запрос, но, к сожалению, не увенчался успехом. Пожалуйста, кто-нибудь может мне помочь?
1 ответ
Наиболее распространенное решение для IN
(а также NOT IN
) проблемы с производительностью в использовании EXISTS
(или же NOT EXISTS
) вместо:
select mid from aplicacao
where not exists (
select 1 from prod_app
where prod_app.mid = aplicacao.mid and prod_app.coditem=1
)
Другое решение заключается в использовании LEFT JOIN
и фильтр на отсутствие правой стороны:
select mid from aplicacao
left join prod_app
on prod_app.mid = aplicacao.mid and prod_app.coditem=1
where prod.app.coditem is null
Обратите внимание, что дополнительные условия фильтрации на prod_app
(лайк prod_app.coditem=1
) должны быть частью условия соединения, а не where
пункт.