Wenn beide Tabellenausdrücke keine Kommas enthalten, untersucht SQL Anywhere die Fremdschlüsselbeziehungen in den Tabellenpaaren in der Anweisung und generiert eine einzige Join-Bedingung.
Folgender Join hat z.B. zwei Tabellenpaare, A-C und B-C.
(A NATURAL JOIN B) KEY JOIN C |
SQL Anywhere generiert eine einzige Join-Bedingung, um C mit (A NATURAL JOIN B)
zu verknüpfen, indem der Server die Fremdschlüsselbeziehung in den Tabellenpaaren A-C und B-C untersucht. Der Server erstellt
eine Join-Bedingung für die beiden Paare gemäß den Regeln zur Festlegung von Schlüssel-Joins, wenn mehrere Fremdschlüsselbeziehungen
vorhanden sind:
Zunächst wird in A-C und B-C nach einem einzigen Fremdschlüssel gesucht, dessen Rollenname dem Korrelationsnamen einer der beiden Primärschlüsseltabellen entspricht, die er referenziert. Wenn genau ein Fremdschlüssel diese Bedingung erfüllt, wird dieser verwendet. Wenn mehrere Fremdschlüssel mit dem Rollennamen der Korrelation einer Tabelle vorhanden sind, ist der Join zweideutig, und es wird ein Fehler ausgegeben.
Wenn kein Fremdschlüssel mit dem Namen der Korrelation einer 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 keine Fremdschlüsselbeziehung vorhanden ist, wird ein Fehler ausgegeben.
Weitere Hinweise finden Sie unter Schlüssel-Joins bei mehrfachen Fremdschlüsselbeziehungen.
Folgende Abfrage sucht alle Mitarbeiter, die Vertriebspersonen sind, und deren Abteilungen:
SELECT Employees.Surname, FK_DepartmentID_DepartmentID.DepartmentName FROM ( Employees KEY JOIN Departments AS FK_DepartmentID_DepartmentID ) KEY JOIN SalesOrders; |
Sie können die Abfrage wie folgt interpretieren:
SQL Anywhere überprüft den Tabellenausdruck ( Employees KEY JOIN Departments as FK_DepartmentID_DepartmentID )
und generiert die Join-Bedingung Employees.DepartmentID = FK_DepartmentID_DepartmentID.DepartmentID
basierend auf dem Fremdschlüssel "FK_DepartmentID_DepartmentID".
SQL Anywhere prüft dann die Tabellenpaare "Employees/SalesOrders" und "Departments/SalesOrders". Hinweis: Zwischen den Tabellen
"SalesOrders" und "Employees" und zwischen "SalesOrders" und "Departments" darf es nur einen Fremdschlüssel geben. Anderenfalls
ist der Join zweideutig. Wie sich herausstellt, gibt es genau eine Fremdschlüsselbeziehung zwischen den Tabellen "SalesOrders"
und "Employees" (FK_SalesRepresentative_EmployeeID) und keine Fremdschlüsselbeziehung zwischen "SalesOrders" und "Departments".
Daher lautet die generierte Join-Bedingung SalesOrders.EmployeeID = Employees.SalesRepresentative
.
Die nachstehende Abfrage ist daher der vorherigen Abfrage gleichwertig:
SELECT Employees.Surname, Departments.DepartmentName FROM ( Employees JOIN Departments ON ( Employees.DepartmentID = Departments.DepartmentID ) ) JOIN SalesOrders ON ( Employees.EmployeeID = SalesOrders.SalesRepresentative ); |
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 |