Um eine Join-Bedingung für den Schlüssel-Join von zwei Tabellenausdruckslisten zu erstellen, untersucht SQL Anywhere die Tabellenpaare aus der Anweisung und generiert für jedes Paar eine Join-Bedingung. Die endgültige Join-Bedingung ist schließlich die Verbindung der Join-Bedingungen für jedes Paar. Zwischen jedem Paar muss eine Fremdschlüsselbeziehung bestehen.
Folgendes Beispiel verknüpft die beiden Tabellenpaare A-C und B-C:
SELECT * FROM ( A,B ) KEY JOIN C; |
SQL Anywhere generiert eine Join-Bedingung, um C mit (A,B)
zu verknüpfen, indem für jedes der beiden Paare A-C und B-C eine Join-Bedingung generiert wird. Dabei werden die Regeln für
Schlüssel-Joins bei mehreren Fremdschlüsselbeziehungen befolgt:
SQL Anywhere sucht für jedes Paar nach einem Fremdschlüssel, dessen Rollenname dem Korrelationsnamen der Primärschlüsseltabelle 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 Paare ein Fremdschlüssel mit dem Korrelationsnamen der Tabelle vorhanden ist, sucht SQL Anywhere nach einer beliebigen Fremdschlüsselbeziehung zwischen den Tabellen. Wenn es 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 bestimmen kann, werden die Join-Bedingungen mit AND verknüpft.
Siehe auch Schlüssel-Joins bei mehrfachen Fremdschlüsselbeziehungen.
Folgende Abfrage gibt die Namen aller Vertriebsangestellten zurück, die mindestens eine Bestellung aus einer bestimmten Region aufgenommen haben.
SELECT DISTINCT Employees.Surname, FK_DepartmentID_DepartmentID.DepartmentName, SalesOrders.Region FROM ( SalesOrders, Departments AS FK_DepartmentID_DepartmentID ) KEY JOIN Employees; |
Surname | DepartmentName | Region |
---|---|---|
Chin | Sales | Eastern |
Chin | Sales | Western |
Chin | Sales | Central |
... | ... | ... |
Diese Abfrage arbeitet mit zwei Tabellenpaaren: "SalesOrders" und "Employees" sowie "Departments AS FK_DepartmentID_DepartmentID" und "Employees".
Für das Paar "SalesOrders" und "Employees" gibt es keinen Fremdschlüssel, der dem Rollennamen einer der Tabellen entspricht.
Es gibt jedoch einen Fremdschlüssel (FK_SalesRepresentative_EmployeeID), der sich auf diese beiden Tabellen bezieht. Dies
ist der einzige Fremdschlüssel, der sich auf die beiden Tabellen bezieht, und er wird daher in der generierten Join-Bedingung
( Employees.EmployeeID = SalesOrders.SalesRepresentative )
verwendet.
Für das Paar "Departments AS FK_DepartmentID_DepartmentID" und "Employees" gibt es einen Fremdschlüssel, der denselben Rollennamen
hat wie die Primärschlüsseltabelle. Er heißt "FK_DepartmentID_DepartmentID" und damit genauso wie der Korrelationsname der
Tabelle "Departments" in der Abfrage. Es gibt keine anderen Fremdschlüssel mit dem Namen der Korrelation der Primärschlüsseltabelle,
sodass "FK_DepartmentID_DepartmentID" verwendet wird, um die Join-Bedingung für das Tabellenpaar zu bilden. Die Join-Bedingung,
die generiert wird, lautet (Employees.DepartmentID = FK_DepartmentID_DepartmentID.DepartmentID)
. Hinweis: Es ist ein weiterer Fremdschlüssel vorhanden, der die beiden Tabellen verbindet, doch da dieser einen anderen Namen
hat als die beiden Tabellen, ist er nicht relevant.
Die endgültige Join-Bedingung fügt schließlich die für die beiden Tabellenpaare generierten Join-Bedingungen zusammen. Folgende Abfrage ist daher gleichwertig:
SELECT DISTINCT Employees.Surname, Departments.DepartmentName, SalesOrders.Region FROM ( SalesOrders, Departments ) JOIN Employees ON Employees.EmployeeID = SalesOrders.SalesRepresentative AND Employees.DepartmentID = Departments.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 |