Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Daten abfragen und ändern » Joins: Daten aus mehreren Tabellen abrufen » Schlüssel-Joins

 

Schlüssel-Joins bei mehrfachen Fremdschlüsselbeziehungen

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.

Korrelationsname und Rollenname

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.

Join-Bedingungen generieren

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.

Beispiel 1

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".

Die Employees-Tabelle und die Departments-Tabelle mit ihren Fremdschlüssel-Beziehungen.

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;
Beispiel 2

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;
Beispiel 3

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;
Beispiel 4

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;
Hinweis

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;