Как улучшить выбор с не в 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 пункт.

Другие вопросы по тегам