Also umformulieren kannst du das ganze SELECT schon:
SELECT tab.* FROM tab, anderetabelle WHERE tab.id <> anderetabelle.id
Ich würde hier kein SUBSELECT und auch nicht die IN() Funktion benutzen, weil das Ganze auch wesentlich einfacher geht. Aber ob das auch performanter ist, konnte ich leider nicht bestätigen. Bei mir laufen beide SELECTS mit nahezu gleicher Geschwindigkeit:
Ich habe es allerdings mit einer Sybase Datenbank ausprobiert. Ich weiß nicht, ob Access hier anders reagiert. Prinzipiell ist es der gleiche Ablauf der hier getätigt werden muss:
Jede Zeile von Tabelle 1 wird mit jeder Spalte von Tabelle 2 verglichen. Prinzipiell also kein Unterschied, es sei denn Access nutzt die IN() Funktion anders. Korrigiert mich wenn ich falsch liege.
Nur der Vollständigkeit halber: Eine Abfrage mit WHERE NOT IN und die Lösung mit OUTER JOIN und WHERE ... IS NULL liefern nicht in jedem Fall identische Ergebnisse! Und zwar dann nicht, wenn NULL-Werte im Spiel sind. Sind in "anderetabelle" Nullwerte für "id" enthalten, dann ist das Ergebnis der WHERE NOT IN Abfrage IMMER leer, während die OUTER JOIN Lösung weiterhin eine Treffermenge liefert.
@Dustin Klein [quote]Jede Spalte von Tabelle 1 wird mit jeder Spalte von Tabelle 2 verglichen. Prinzipiell also kein Unterschied, ... Korrigiert mich wenn ich falsch liege.[/quote] Ja, da muß ich dich korrigieren. Ein WHERE NOT IN ist nicht das gleiche wie ein INNER JOIN mit <>! Bei beiden werden nur die id-Spalten miteinander verglichen und nicht Jede mit Jeder (Mglws. meinst du hier ja Zeilen). Beim Join wird jede Zeile der Einen mit jeder Zeile der Anderen verglichen und ALLE ausgewählt die ungleich sind, während IN eher einer Oder-Verküpfung entspricht.
d.h. in diesem Fall: zuerst die Unterabfrage ausführen, die daraus resultierenden IDs mittels RecordSet merken und dann die zweite Abfrage zu starten und die konkreten IDs einzubauen
falls das insgesamt keine Verbesserung bringt, kann man damit aber besser unterscheiden, welche der beiden Abfragen lange läuft (von wegen fehlende Indizes)
Bei Performance fällt mir aber zuerst die Frage nach fehlenden Indezies/Keys ein.
select tab.*
from tab
left outer join anderetabelle on tab.id=anderetabelle.id
wheer anderetabelle.id is null