Первый подход
select a.* from a where a.id not in (select b.ida from b)
второй подход
select a.*
from a left outer join b on a.id = b.ida
where b.ida is null
Первый подход очень дорогой. Второй подход лучше.
В PostgreSql 9.4 я выполнил функцию «объяснить запрос» и первый запрос в виде стоимости cost = 0.00..1982043603.32 .
Вместо этого запрос соединения как стоимость стоимость = 45946.77..45946.78
Например, я ищу все продукты, которые не совместимы ни с одним транспортным средством. У меня 100 000 продуктов и более 1 м совместимости.
select count(*) from product a left outer join compatible c on a.id=c.idprod where c.idprod is null
Запрос на соединение занимал около 5 секунд, вместо этого версия подзапроса никогда не заканчивалась через 3 минуты.