Einzelnen Beitrag anzeigen

tgvoelker

Registriert seit: 9. Sep 2002
Ort: Oelsnitz, Vogtland
44 Beiträge
 
Delphi 12 Athens
 
#12

AW: SQL optimieren

  Alt 26. Mai 2013, 20:19
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.
Thomas Völker

Geändert von tgvoelker (26. Mai 2013 um 20:21 Uhr)
  Mit Zitat antworten Zitat