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:
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].
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; |
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.
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; |
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 |