Ein häufiger Fehler bei der Verwendung von Outer-Joins ist die Positionierung der Join-Bedingung. Wenn Sie Einschränkungen für die Nullwert-liefernde Tabelle in einer WHERE-Klausel angeben, ist der Join in den meisten Fällen gleichwertig zu einem Inner-Join.
Das liegt daran, dass die meisten Suchbedingungen nicht als TRUE ausgewertet werden können, wenn eine ihrer Eingaben NULL ist. Die Einschränkungen der WHERE-Klausel für die Nullwert-liefernde Tabelle vergleicht Werte mit NULL, was zum Ausschluss der betreffenden Zeile aus der Ergebnismenge führt. Die Zeilen in der beibehaltenen Tabelle werden nicht beibehalten, wodurch der Join ein Inner-Join wird.
Eine Ausnahme bilden Vergleiche, die als TRUE ausgewertet werden, wenn eine der Eingaben NULL ist. Dazu zählen IS NULL, IS UNKNOWN, IS FALSE, IS NOT TRUE und Ausdrücke, die ISNULL oder COALESCE enthalten.
Die nachstehende Anweisung berechnet z.B. einen Links-Outer-Join:
SELECT * FROM Customers KEY LEFT OUTER JOIN SalesOrders ON SalesOrders.OrderDate < '2000-01-03'; |
Folgende Anweisung erstellt dagegen einen Inner-Join:
SELECT Surname, OrderDate FROM Customers KEY LEFT OUTER JOIN SalesOrders WHERE SalesOrders.OrderDate < '2000-01-03'; |
Die erste dieser beiden Anweisungen kann man sich wie folgt vorstellen: Zuerst wird in einem Links-Outer-Join die Tabelle "Customers" mit der Tabelle "SalesOrders" verknüpft. Die Ergebnismenge umfasst alle Zeilen in der Tabelle "Customers". Für diejenigen Kunden, die keine Bestellung vor dem 3. Januar 2000 aufgegeben haben, werden die Felder für die Bestellung mit NULL gefüllt.
In der zweiten Anweisung wird in einem Links-Outer-Join "Customers" mit "SalesOrders" verknüpft. Die Ergebnismenge umfasst alle Zeilen in der Tabelle "Customers". Für diejenigen Kunden, die keine Bestellung aufgegeben haben, werden die Felder für die Bestellung mit NULL gefüllt. Anschließend wird die WHERE-Bedingung angewendet, indem nur die Zeilen ausgewählt werden, in denen der Kunde seit dem 3. Januar 2000 einen Auftrag erteilt hat. Bei Kunden, die keine Aufträge erteilt haben, sind diese Werte NULL. Das Ergebnis eines Wertevergleichs mit NULL ist immer UNKNOWN. Diese Zeilen werden daher eliminiert, und die Anweisung wird zu einem Inner-Join reduziert.
Weitere Hinweise zu Suchbedingungen finden Sie unter Suchbedingungen.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |