Wenn SQL Anywhere versucht, eine Join-Bedingung basierend auf einer Fremdschlüsselbeziehung zu generieren, findet der Server möglicherweise mehr als eine Beziehung. In diesem Fall bestimmt SQL Anywhere, welche Fremdschlüsselbeziehung verwendet wird, indem der Rollenname des Fremdschlüssels mit dem Korrelationsnamen der Primärschlüsseltabelle verglichen wird, die der Fremdschlüssel referenziert.
Die folgenden Abschnitte beschreiben, wie SQL Anywhere Join-Bedingungen für Schlüssel-Joins generiert. Diese Informationen werden unter Regeln, die die Verarbeitung von Schlüssel-Joins beschreiben zusammengefasst.
Ein Korrelationsname ist der Name einer Tabelle oder Ansicht, die in der FROM-Klausel der Abfrage verwendet wird — entweder unter ihrem ursprünglichen Namen oder unter einem Aliasnamen, der in der FROM-Klausel festgelegt wird.
Der Rollenname ist der Name des Fremdschlüssels. Er muss für eine bestimmte Fremdtabelle (untergeordnete Tabelle) eindeutig sein.
Wenn Sie keinen Rollennamen für einen Fremdschlüssel festlegen, wird der Name wie folgt zugewiesen:
Wenn es keinen Fremdschlüssel mit dem Namen der Primärtabelle gibt, wird der Primärtabellenname als Rollenname zugeordnet.
Wenn der Tabellenname bereits von einem anderen Fremdschlüssel verwendet wird, ist der Rollenname der Name der Primärtabelle, verbunden mit einer für die Fremdtabelle eindeutigen dreistelligen Zahl, die mit Nullen aufgefüllt wird.
Wenn Sie den Rollennamen eines Fremdschlüssels nicht kennen, können Sie ihn in Sybase Central suchen, indem Sie den Datenbankbehälter im linken Fensterausschnitt öffnen. Wählen Sie die Tabelle im linken Fensterausschnitt und klicken Sie auf das Register Integritätsregeln im rechten Fensterausschnitt. Eine Liste der Fremdschlüssel für diese Tabelle wird im rechten Fensterausschnitt angezeigt.
Unter Schema der Beispieldatenbank finden Sie ein Diagramm, das die Rollennamen aller Fremdschlüssel in der SQL Anywhere-Beispieldatenbank umfasst.
SQL Anywhere sucht nach einem Fremdschlüssel, dessen Rollenname dem Korrelationsnamen der Primärschlüsseltabelle entspricht:
Wenn es genau einen Fremdschlüssel gibt, der den selben Namen wie eine Tabelle im Join trägt, verwendet SQL Anywhere ihn dazu, die Join-Bedingung zu generieren.
Wenn mehrere Fremdschlüssel mit dem Namen einer Tabelle vorhanden sind, ist der Join zweideutig, und es wird ein Fehler ausgegeben.
Wenn kein Fremdschlüssel mit dem Namen einer Tabelle vorhanden ist, sucht SQL Anywhere nach einer Fremdschlüsselbeziehung, selbst wenn die Namen nicht übereinstimmen. Wenn es mehrere Fremdschlüsselbeziehungen gibt, ist der Join zweideutig, und es wird ein Fehler ausgegeben.
In der SQL Anywhere-Beispieldatenbank werden von den Tabellen "Employees" und "Departments" zwei Fremdschlüsselbeziehungen festgelegt: Der Fremdschlüssel "FK_DepartmentID_DepartmentID" in der Tabelle "Employees" referenziert die Tabelle "Departments", und der Fremdschlüssel "FK_DepartmentHeadID_EmployeeID" in der Tabelle "Departments" referenziert die Tabelle "Employees".
Folgende Abfrage ist zweideutig, da zwei Fremdschlüsselbeziehungen vorhanden sind und keine von ihnen denselben Rollennamen
wie die Primärschlüsseltabelle hat. Diese Abfrage bewirkt daher den Syntaxfehler SQLE_AMBIGUOUS_JOIN (-147)
.
SELECT Employees.Surname, Departments.DepartmentName FROM Employees KEY JOIN Departments; |
Diese Abfrage ändert die Abfrage in Beispiel 1 durch die Angabe des Korrelationsnamens "FK_DepartmentID_DepartmentID" für die Tabelle "Departments". Der Fremdschlüssel "FK_DepartmentID_DepartmentID" hat nun denselben Namen wie die Tabelle, die er referenziert. Deshalb wird er verwendet, um die Join-Bedingung festzulegen. Das Ergebnis umfasst die Nachnamen aller Mitarbeiter und die Abteilungen, in denen sie arbeiten.
SELECT Employees.Surname, FK_DepartmentID_DepartmentID.DepartmentName FROM Employees KEY JOIN Departments AS FK_DepartmentID_DepartmentID; |
Folgende Abfrage ist gleichwertig. Es ist in diesem Beispiel nicht erforderlich, einen Aliasnamen für die Tabelle "Departments" zu erstellen. Dieselbe Join-Bedingung, die oben generiert wurde, wird in der ON-Klausel dieser Abfrage angegeben:
SELECT Employees.Surname, Departments.DepartmentName FROM Employees JOIN Departments ON Departments.DepartmentID = Employees.DepartmentID; |
Wenn beabsichtigt ist, alle Mitarbeiter aufzulisten, die Abteilungsleiter sind, muss der Fremdschlüssel "FK_DepartmentHeadID_EmployeeID" verwendet und Beispiel 1 wie folgt umgeschrieben werden. Diese Abfrage erfordert die Verwendung des Fremdschlüssels "FK_DepartmentHeadID_EmployeeID" durch die Angabe des Korrelationsnamens "FK_DepartmentHeadID_EmployeeID" für die Primärschlüsseltabelle "Employees".
SELECT FK_DepartmentHeadID_EmployeeID.Surname, Departments.DepartmentName FROM Employees AS FK_DepartmentHeadID_EmployeeID KEY JOIN Departments; |
Folgende Abfrage ist gleichwertig. Die Join-Bedingung, die oben generiert wurde, wird in der ON-Klausel dieser Abfrage angegeben:
SELECT Employees.Surname, Departments.DepartmentName FROM Employees JOIN Departments ON Departments.DepartmentHeadID = Employees.EmployeeID; |
Es ist kein Korrelationsname erforderlich, wenn der Name des Fremdschlüssels mit dem Namen der Primärschlüsseltabelle übereinstimmt. Es ist z.B. möglich, den Fremdschlüssel "Departments" für die Tabelle "Employees" festzulegen:
ALTER TABLE Employees ADD FOREIGN KEY Departments (DepartmentID) REFERENCES Departments (DepartmentID); |
Diese Fremdschlüsselbeziehung ist nun die Standard-Join-Bedingung, wenn ein KEY JOIN für die beiden Tabellen festgelegt wird. Wenn der Fremdschlüssel "Departments" festgelegt wird, ist folgende Abfrage gleichwertig zu Beispiel 3:
SELECT Employees.Surname, Departments.DepartmentName FROM Employees KEY JOIN Departments; |
Wenn Sie dieses Beispiel in Interactive SQL ausprobieren, müssen Sie die Änderung der SQL Anywhere-Beispieldatenbank mit folgender Anweisung rückgängig machen:
ALTER TABLE Employees DROP FOREIGN KEY Departments; |
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 |