Wenn Tabellenausdruckslisten über einen Schlüssel-Join mit Tabellenausdrücken verknüpft werden, die keine Kommas enthalten, generiert SQL Anywhere für jede Tabelle in der Tabellenausdrucksliste eine Join-Bedingung.
Folgende Anweisung ist z.B. der Schlüssel-Join einer Tabellenausdrucksliste und eines Tabellenausdrucks, der keine Kommas
enthält. Dieses Beispiel generiert eine Join-Bedingung für Tabelle A mit dem Tabellenausdruck C NATURAL JOIN D
, und für Tabelle B mit dem Tabellenausdruck C NATURAL JOIN D
.
SELECT * FROM (A,B) KEY JOIN (C NATURAL JOIN D); |
(A,B)
ist eine Liste von Tabellenausdrücken, und C NATURAL JOIN D
ist ein Tabellenausdruck. SQL Anywhere muss daher zwei Join-Bedingungen generieren: Es wird eine Join-Bedingung für die Paare
A-C und A-D generiert und eine zweite Join-Bedingung für die Paare B-C und B-D. Dabei werden die Regeln für Schlüssel-Joins
bei mehreren Fremdschlüsselbeziehungen befolgt:
SQL Anywhere sucht für jedes Tabellenpaar nach einem Fremdschlüssel, dessen Rollenname dem Korrelationsnamen einer der Primärschlüsseltabellen entspricht. Wenn genau ein Fremdschlüssel diese Bedingung erfüllt, wird dieser verwendet. Wenn es mehrere gibt, ist der Join zweideutig, und es wird ein Fehler ausgegeben.
Wenn für keines der Tabellenpaare ein Fremdschlüssel mit dem Korrelationsnamen einer Tabelle vorhanden ist, sucht SQL Anywhere nach einer beliebigen Fremdschlüsselbeziehung zwischen den Tabellen. Wenn es genau eine solche Beziehung gibt, wird sie verwendet. Wenn es mehrere gibt, ist der Join zweideutig, und es wird ein Fehler ausgegeben.
Wenn für keines der Paare eine Fremdschlüsselbeziehung vorhanden ist, wird ein Fehler ausgegeben.
Wenn SQL Anywhere für jedes Paar genau eine Join-Bedingung feststellen kann, werden die Join-Bedingungen mit dem Schlüsselwort AND verknüpft.
Untersuchen Sie folgende Verknüpfung von fünf Tabellen:
((A,B) JOIN (C NATURAL JOIN D) ON A.x = D.y) KEY JOIN E |
In diesem Fall generiert SQL Anywhere eine Join-Bedingung für den Schlüssel-Join zu E, indem eine Bedingung entweder zwischen
(A,B)
und E oder zwischen C NATURAL JOIN D
und E generiert wird, wie unter Schlüssel-Joins von Tabellenausdrücken ohne Kommas beschrieben.
Wenn SQL Anywhere eine Join-Bedingung zwischen (A,B)
und E generiert, muss der Server zwei Join-Bedingungen erstellen, nämlich eine für A-E und eine zweite für B-E. Dabei muss
eine gültige Fremdschlüsselbeziehung innerhalb jedes Tabellenpaares gefunden werden. Dies wird unter Schlüssel-Joins von Tabellenausdruckslisten beschrieben.
Wenn SQL Anywhere eine Join-Bedingung zwischen C NATURAL JOIN D
und E erstellt, wird nur eine Join-Bedingung erstellt, und daher muss nur eine Fremdschlüsselbeziehung in den Paaren C-E
und D-E gefunden werden. Weitere Hinweise finden Sie auch unter Schlüssel-Joins von Tabellenausdrücken ohne Kommas.
Folgendes Beispiel enthält einen Schlüssel-Join eines Tabellenausdrucks und eine Liste von Tabellenausdrücken. Das Beispiel liefert die Namen und Abteilungen der Mitarbeiter, die Vertriebsmitarbeiter und gleichzeitig Abteilungsleiter sind.
SELECT DISTINCT Employees.Surname, FK_DepartmentID_DepartmentID.DepartmentName FROM ( SalesOrders, Departments AS FK_DepartmentID_DepartmentID ) KEY JOIN ( Employees JOIN Departments AS d ON Employees.EmployeeID = d.DepartmentHeadID ); |
SQL Anywhere generiert zwei Join-Bedingungen:
Es gibt genau eine Fremdschlüssel-Beziehung zwischen den Tabellenpaaren "SalesOrders/Employees" und "SalesOrders/d": SalesOrders.SalesRepresentative = Employees.EmployeeID
Es gibt genau eine Fremdschlüssel-Beziehung zwischen den Tabellenpaaren "FK_DepartmentID_DepartmentID/Employees" und "FK_DepartmentID_DepartmentID/d":
FK_DepartmentID_DepartmentID.DepartmentID = Employees.DepartmentID
.
Dieses Beispiel ist gleichwertig zu Folgendem: In der folgenden Version ist es nicht erforderlich, den Korrelationsnamen Departments AS FK_DepartmentID_DepartmentID
zu erstellen, da dies nur nötig war, um zu klären, welcher der beiden Fremdschlüssel verwendet werden soll, um "Employees"
und "Departments" zu verknüpfen.
SELECT DISTINCT Employees.Surname, Departments.DepartmentName FROM ( SalesOrders, Departments ) JOIN ( Employees JOIN Departments AS d ON Employees.EmployeeID = d.DepartmentHeadID ) ON SalesOrders.SalesRepresentative = Employees.EmployeeID AND Departments.DepartmentID = Employees.DepartmentID; |
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 |