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

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

 

Doppelte Korrelationsnamen in Joins (Stern-Joins)

Der Grund für die Verwendung doppelter Tabellennamen ist die Erstellung eines Stern-Joins. In einem Stern-Join wird eine Tabelle oder Ansicht mit mehreren anderen verknüpft.

Um einen Stern-Join zu erstellen, verwenden Sie denselben Tabellen-, Ansichts- oder Korrelationsnamen in der FROM-Klausel mehrfach. Dies ist eine Erweiterung zum ANSI/ISO SQL-Standard. Die Möglichkeit, Duplikatnamen zu verwenden, bietet keine zusätzliche Funktionalität, doch es wird wesentlich einfacher, bestimmte Abfragen zu erstellen.

Die Duplikatnamen müssen in verschiedenen Joins enthalten sein, um sinnvoll zu sein. Wenn ein Tabellen- oder Ansichtsname in einem Join doppelt vorkommt, wird die zweite Instanz ignoriert. Beispiel: FROM A,A und FROM A CROSS JOIN A werden beide als FROM A interpretiert.

Folgendes Beispiel, in dem A, B und C Tabellen sind, ist in SQL Anywhere gültig. In diesem Beispiel wird dieselbe Instanz von Tabelle A sowohl mit B als auch mit C verknüpft. Beachten Sie, dass ein Komma erforderlich ist, um die Joins in einem Stern-Join zu trennen. Die Verwendung eines Kommas in einem Stern-Join ist spezifisch für die Syntax von Stern-Joins.

SELECT *
FROM A LEFT OUTER JOIN B ON A.x = B.x,
     A LEFT OUTER JOIN C ON A.y = C.y;

Das nächste Beispiel ist gleichwertig.

SELECT *
FROM A LEFT OUTER JOIN B ON A.x = B.x,
     C RIGHT OUTER JOIN A ON A.y = C.y;

Beide Beispiele sind gleichwertig zur folgenden ANSI/ISO-Standardsyntax: (Die Klammern sind optional.)

SELECT *
FROM (A LEFT OUTER JOIN B ON A.x = B.x)
LEFT OUTER JOIN C ON A.y = C.y;

Im nächsten Beispiel wird Tabelle mit drei Tabellen verknüpft: A, B und C.

SELECT *
FROM A JOIN B ON A.x = B.x,
     A JOIN C ON A.y = C.y,
     A JOIN D ON A.w = D.w;

Dies ist gleichwertig zur folgenden ANSI/ISO-Standardsyntax: (Die Klammern sind optional.)

SELECT *
FROM ((A JOIN B ON A.x = B.x)
JOIN C ON A.y = C.y)
JOIN D ON A.w = D.w;

Bei komplexen Joins kann es hilfreich sein, ein Diagramm zu zeichnen. Das obige Beispiel kann mit folgendem Diagramm beschrieben werden, das illustriert, dass die Tabellen B, C und D über Tabelle A verknüpft sind:

Tabelle A ist im Zentrum. während B, C, und D mit ihr verbunden sind.
Hinweis

Sie können doppelte Tabellennamen nur dann verwenden, wenn die Option "extended_join_syntax" auf "On" gesetzt ist (Standardeinstellung).

Weitere Hinweise finden Sie unter extended_join_syntax-Option [Datenbank].

Beispiel 1

Erstellen Sie eine Liste mit den Namen der Kunden, die Bestellungen bei Rollin Overbey aufgegeben haben. Beachten Sie, dass eine der Tabellen in der FROM-Klausel, die Tabelle "Employees", keine Spalten zu den Ergebnissen beiträgt. Darüber hinaus erscheinen die durch den Join verbundenen Spalten —wie "Customer.ID" oder "Employees.EmployeeID"—nicht in den Ergebnissen. Trotzdem ist dieser Join nur durch die Verwendung der Tabelle "Employees" in der FROM-Klausel möglich.

SELECT Customers.GivenName, Customers.Surname,
   SalesOrders.OrderDate
FROM   SalesOrders KEY JOIN Customers,
      SalesOrders KEY JOIN Employees
WHERE Employees.GivenName = 'Rollin'
  AND Employees.Surname = 'Overbey'
ORDER BY SalesOrders.OrderDate;
GivenName Surname OrderDate
Tommie Wooten 2000-01-03
Michael Agliori 2000-01-08
Salton Pepper 2000-01-17
Tommie Wooten 2000-01-23
... ... ...

Im Folgenden sehen Sie die gleichwertige Anweisung in der ANSI/ISO-Standardsyntax:

SELECT Customers.GivenName, Customers.Surname,
  SalesOrders.OrderDate
FROM SalesOrders JOIN Customers
  ON SalesOrders.CustomerID = 
   Customers.ID
JOIN Employees
  ON SalesOrders.SalesRepresentative = 
   Employees.EmployeeID
WHERE Employees.GivenName = 'Rollin'
  AND Employees.Surname = 'Overbey'
ORDER BY SalesOrders.OrderDate;
Beispiel 2

Dieses Beispiel beantwortet folgende Frage: Wie viele Produkte haben die einzelnen Kunden bestellt, und wer ist der Abteilungsleiter des Verkäufers, der die Bestellung aufgenommen hat?

Um die Frage zu beantworten, listen Sie zunächst die Informationen auf, die Sie abfragen müssen. In diesem Fall handelt es sich um Produkt, Menge, Kundenname und Abteilungsleitername. Danach listen Sie die Tabellen auf, die diese Informationen enthalten. Hierbei handelt es sich um die Tabellen "Products", "SalesOrderItems", "Customers" und "Employees". Wenn Sie sich die Struktur der SQL Anywhere-Beispieldatenbank ansehen (siehe Schema der Beispieldatenbank), werden Sie feststellen, dass diese Tabellen über die Tabelle "SalesOrders" verknüpft sind. Sie können einen Stern-Join für die Tabelle "SalesOrders" erstellen, um die Informationen aus den anderen Tabellen abzufragen.

Außerdem müssen Sie einen Selbst-Join erstellen, um den Namen des Abteilungsleiters zu erhalten, da die Tabelle "Employees" die ID-Nummern für Abteilungsleiter und die Namen aller Mitarbeiter enthält, nicht aber eine Spalte, die nur die Namen der Abteilungsleiter auflistet. Weitere Hinweise finden Sie unter Selbst-Joins.

Die folgende Anweisung erstellt einen Stern-Join um die Tabelle "SalesOrders". Alle Joins sind Outer-Joins, sodass die Ergebnismenge alle Kunden umfasst. Einige Kunden haben keine Bestellungen aufgegeben, daher sind die anderen Werte für diese Kunden NULL. Die Ergebnismenge enthält Spalten für Kunden, Produkte, Bestellmengen und die Namen der Abteilungsleiter der Verkäufer.

SELECT Customers.GivenName, Products.Name,
  SUM(SalesOrderItems.Quantity), m.GivenName
FROM SalesOrders
    KEY RIGHT OUTER JOIN Customers,
   SalesOrders
    KEY LEFT OUTER JOIN SalesOrderItems
    KEY LEFT OUTER JOIN Products,
      SalesOrders
    KEY LEFT OUTER JOIN Employees AS e
    LEFT OUTER JOIN Employees AS m
        ON (e.ManagerID = m.EmployeeID)
WHERE Customers.State = 'CA'
GROUP BY Customers.GivenName, Products.Name, m.GivenName
ORDER BY SUM(SalesOrderItems.Quantity) DESC, 
   Customers.GivenName;
GivenName Name SUM(SalesOrderItems.Quantity) GivenName
Sheng Baseball Cap 240 Moira
Laura Tee Shirt 192 Moira
Moe Tee Shirt 192 Moira
Leilani Sweatshirt 132 Moira
... ... ... ...

Es folgt ein Diagramm der Tabellen in diesem Stern-Join. Die Pfeile zeigen die Richtung (links oder rechts) der Outer-Joins an. Wie Sie sehen, wird die vollständige Liste der Kunden in allen Joins beibehalten.

Die Tabelle "Customers" ist rechts, mit einem auf die Tabelle "SalesOrder" zeigenden Pfeil. Von der Tabelle "SalesOrder" gibt es zwei Pfeile, die auch beide nach links zeigen. Ein Pfeil zeigt auf "SalesOrderItems", und von "SalesOrderItems" auf "Products". Der andere Pfeil zeigt auf "Employees AS e, und von "Employees AS e" zu "Employees AS m".

Folgende ANSI/ISO-Standardsyntax ist gleichwertig zum Stern-Join in Beispiel 2.

SELECT Customers.GivenName, Products.Name,
  SUM(SalesOrderItems.Quantity), m.GivenName
FROM SalesOrders LEFT OUTER JOIN SalesOrderItems
    ON SalesOrders.ID = SalesOrderItems.ID
  LEFT OUTER JOIN Products
    ON SalesOrderItems.ProductID = Products.ID
  LEFT OUTER JOIN Employees as e
    ON SalesOrders.SalesRepresentative = e.EmployeeID
  LEFT OUTER JOIN Employees as m
    ON e.ManagerID = m.EmployeeID
  RIGHT OUTER JOIN Customers
    ON SalesOrders.CustomerID = Customers.ID
WHERE Customers.State = 'CA'
GROUP BY Customers.GivenName, Products.Name, m.GivenName
ORDER BY SUM(SalesOrderItems.Quantity) DESC, 
   Customers.GivenName;