La première approche est
select a.* from a where a.id not in (select b.ida from b)
la seconde approche est
select a.*
from a left outer join b on a.id = b.ida
where b.ida is null
La première approche est très coûteuse. La deuxième approche est meilleure.
Avec PostgreSQL 9.4, j'ai fait la fonction "explain query" et la première requête comme un coût de cost = 0.00 ..1982043603,32. Au lieu de cela la requête de jointure en tant que coût de coût = 45946.77..45946.78
Par exemple, je recherche tous les produits qui ne sont pas compatibles avec aucun véhicule. J'ai 100k produits et plus de 1m de compatibilité. La requête de jointure a passé environ 5 secondes, mais la version de la sous-requête n'a jamais été terminée au bout de 3 minutes.
Cela sera extrêmement coûteux car le moteur doit générer la sous-requête dans son intégralité avant de pouvoir commencer à éliminer les tuples de a. Pas une bonne idée en général. – dland