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 von Tabellenausdrücken

 

Schlüssel-Joins von Tabellenausdrücken ohne Kommas

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.

Beispiel

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