Die Reihenfolge von Joins ist wichtig, wenn der Tabellenausdruck Outer-Joins enthält. A JOIN B LEFT OUTER JOIN C
wird beispielsweise als (A JOIN B) LEFT OUTER JOIN C
interpretiert. Das bedeutet, dass der Tabellenausdruck (A JOIN B)
mit C verknüpft wird. Der Tabellenausdruck (A JOIN B)
wird beibehalten und Tabelle C liefert auch NULL-Zeilen.
In folgender Anweisung werden die Tabellen A, B und C verknüpft:
SELECT * FROM A LEFT OUTER JOIN B RIGHT OUTER JOIN C; |
Um diese Anweisung zu verstehen, muss berücksichtigt werden, dass SQL Anywhere Anweisungen von links nach rechts auswertet und Klammern hinzufügt. Das ergibt folgende Anweisung:
SELECT * FROM (A LEFT OUTER JOIN B) RIGHT OUTER JOIN C; |
Anschließend sollten Sie den Rechts-Outer-Join in einen Links-Outer-Join umwandeln, sodass beide Joins vom selben Typ sind. Hierzu drehen Sie einfach die Position der Tabellen im Rechts-Outer-Join um, wodurch Sie folgendes Ergebnis erhalten:
SELECT * FROM C LEFT OUTER JOIN (A LEFT OUTER JOIN B); |
A ist die beibehaltene Tabelle und B ist die Nullwert-liefernde Tabelle für den verschachtelten Outer-Join. C ist die beibehaltene Tabelle für den ersten Outer-Join.
Sie können diesen Join folgendermaßen interpretieren:
A wird mit B verknüpft, wobei alle Zeilen in A beibehalten werden.
Anschließend wird C mit den Ergebnissen des Joins von A und B verknüpft, wobei alle Zeilen in C beibehalten werden.
Der Join enthält keine ON-Klausel und ist daher standardmäßig ein Schlüssel-Join. Hinweise über die Art, wie SQL Anywhere Join-Bedingungen für diesen Join-Typ generiert, finden Sie unter Schlüssel-Joins von Tabellenausdrücken ohne Kommas.
Außerdem darf die Join-Bedingung für einen Outer-Join nur Tabellen enthalten, die zuvor in der FROM-Klausel referenziert wurden. Diese Einschränkung entspricht dem ANSI/ISO-Standard und wird erzwungen, um Mehrdeutigkeiten zu vermeiden. Folgende Anweisungen sind z.B. syntaktisch falsch, da C in der Join-Bedingung referenziert wird, bevor die Tabelle selbst referenziert wird.
SELECT * FROM (A LEFT OUTER JOIN B ON B.x = C.x) JOIN C; |
und
SELECT * FROM A LEFT OUTER JOIN B ON A.x = C.x, C; |
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |