Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » Joins: Daten aus mehreren Tabellen abrufen » Inner- und Outer-Joins » Outer-Joins

 

Komplexe Outer-Joins

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;