EDIT: Furtbichler hat recht.
Code:
Select Tabelle1.Feld1
from Tabelle1
Left Outer Join Tabelle2 on Tabelle1.Feld2 = Tabelle2.Feld2
and Tabelle1.Feld1 = Tabelle2.Feld1
where Tabelle2.Feld2 is null
Zitat:
Als Ergebnis möchte ich alle Felder1 der Tabelle1 bei denen es in der Tabelle2 nicht einen Datenstz gibt mit dem selben Daten in den Felder1 und 2 wie in der Tabelle 1.
Kombinierten Index machen in beiden Tabellen und das müßte es sein. Ggf. kannst Du auch einen referentiellen Constraint erstellen, könnte einen Zacken schneller sein.
Die
Query kombiniert alle Tupel aus Tabelle 1 mit allen Tupeln aus Tabelle 2, bei denen die Kombination der Felder Feld1 und Feld2 in beiden Tabellen die gleichen Daten haben. Damit nun die WHERE-Klausel alle Tupel aus Tabelle 1 liefert, für die mit dieser Bildungsvorschrift kein Datensatz in Tabelle 2 zugeordnet werden kann, darf Tabelle2.Feld2 keine Nullwerte akzeptieren.
Jensw_2000:
Das hier:
Code:
Select
Tabelle1.Feld1
from
Tabelle1
Left Outer Join Tabelle2
on Tabelle2.Feld1 = Tabelle1.Feld1
and Tabelle2.Feld2 is null
Where
Tabelle1.Feld2 IS NULL
macht was anderes. Es kombiniert alle Tupel aus Tabelle 1 mit allen Tupeln aus Tabelle 2, für die Feld1 jeweils die gleichen Daten enthält und Feld2 in Tabelle 2 NULL ist. Die Where-Klausel filtert lediglich die Tupel aus Tabelle 1, für die Feld2 NULL ist.
Deine Bildungsvorschrift verletzt also die implizite Voraussetzung, daß Feld2 in Tabelle2 keine Nullwerte akzeptiert. Stattdessen gehst Du davon aus, daß Nullwerte zugelassen sind - denn mit Deiner WHERE-Klausel schmeißt Du ja alle Tupel aus Tabelle 1 weg, die in Feld2 keinen NULL stehen haben.
Genaugenommen wird die Ergebnismenge von Dir alle die Tupel aus Tabelle 1 enthalten, für die die Kombination Feld1/Feld2 in Tabelle 2 vorhanden ist und Tabelle1.Feld2 NULL ist.