El primer enfoque es
select a.* from a where a.id not in (select b.ida from b)
el segundo enfoque es
select a.*
from a left outer join b on a.id = b.ida
where b.ida is null
El primer enfoque es muy caro. El segundo enfoque es mejor.
Con PostgreSql 9.4, hice la función "explicar consulta" y la primera consulta como un costo de costo = 0.00 ..1982043603.32. En lugar la consulta de combinación como un costo de costo = 45946.77..45946.78
Por ejemplo, puedo buscar todos los productos que no son compatibles con ningún vehículo. Tengo 100k productos y más de 1m de compatibilidades.
select count(*) from product a left outer join compatible c on a.id=c.idprod where c.idprod is null
La consulta de unión gastó aproximadamente 5 segundos, en cambio, la versión de la subconsulta nunca ha terminado en 3 minutos.
Esto será extremadamente costoso ya que el motor tiene que generar la subconsulta en su totalidad antes de que pueda comenzar a eliminar las tuplas de a. No es una buena idea en general. – dland