Der erste Ansatz ist
select a.* from a where a.id not in (select b.ida from b)
der zweite Ansatz ist
select a.*
from a left outer join b on a.id = b.ida
where b.ida is null
Der erste Ansatz ist sehr teuer. Der zweite Ansatz ist besser.
Mit PostgreSQL 9.4, habe ich die "EXPLAIN Query" -Funktion und die erste Abfrage als Kosten von Kosten = 0,00 ..1982043603.32. Stattdessen kommen die Abfrage als Kosten für Kosten = 45946.77..45946.78
Zum Beispiel habe ich die Suche für alle Produkte, die nicht kompatibel ohne Fahrzeuge. Ich habe 100k Produkte und mehr als 1m Kompatibilität.
Die Join-Abfrage verbrachte etwa 5 Sekunden, stattdessen wurde die Unterabfrage-Version nach 3 Minuten nie beendet.
Dies wird extrem teuer sein, da die Engine die Unterabfrage in ihrer Gesamtheit generieren muss, bevor sie beginnen kann, die Tupel von einem zu entfernen. Im Allgemeinen keine gute Idee. – dland