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 Listen und Tabellenausdrücken ohne Kommas

Wenn Tabellenausdruckslisten über einen Schlüssel-Join mit Tabellenausdrücken verknüpft werden, die keine Kommas enthalten, generiert SQL Anywhere für jede Tabelle in der Tabellenausdrucksliste eine Join-Bedingung.

Folgende Anweisung ist z.B. der Schlüssel-Join einer Tabellenausdrucksliste und eines Tabellenausdrucks, der keine Kommas enthält. Dieses Beispiel generiert eine Join-Bedingung für Tabelle A mit dem Tabellenausdruck C NATURAL JOIN D, und für Tabelle B mit dem Tabellenausdruck C NATURAL JOIN D.

SELECT *
FROM (A,B) KEY JOIN (C NATURAL JOIN D);

(A,B) ist eine Liste von Tabellenausdrücken, und C NATURAL JOIN D ist ein Tabellenausdruck. SQL Anywhere muss daher zwei Join-Bedingungen generieren: Es wird eine Join-Bedingung für die Paare A-C und A-D generiert und eine zweite Join-Bedingung für die Paare B-C und B-D. Dabei werden die Regeln für Schlüssel-Joins bei mehreren Fremdschlüsselbeziehungen befolgt:

  • SQL Anywhere sucht für jedes Tabellenpaar nach einem Fremdschlüssel, dessen Rollenname dem Korrelationsnamen einer der Primärschlüsseltabellen 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 Tabellenpaare ein Fremdschlüssel mit dem Korrelationsnamen einer Tabelle vorhanden ist, sucht SQL Anywhere nach einer beliebigen Fremdschlüsselbeziehung zwischen den Tabellen. Wenn es genau 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 feststellen kann, werden die Join-Bedingungen mit dem Schlüsselwort AND verknüpft.

Beispiel 1

Untersuchen Sie folgende Verknüpfung von fünf Tabellen:

((A,B) JOIN (C NATURAL JOIN D) ON A.x = D.y) KEY JOIN E

In diesem Fall generiert SQL Anywhere eine Join-Bedingung für den Schlüssel-Join zu E, indem eine Bedingung entweder zwischen (A,B) und E oder zwischen C NATURAL JOIN D und E generiert wird, wie unter Schlüssel-Joins von Tabellenausdrücken ohne Kommas beschrieben.

Wenn SQL Anywhere eine Join-Bedingung zwischen (A,B) und E generiert, muss der Server zwei Join-Bedingungen erstellen, nämlich eine für A-E und eine zweite für B-E. Dabei muss eine gültige Fremdschlüsselbeziehung innerhalb jedes Tabellenpaares gefunden werden. Dies wird unter Schlüssel-Joins von Tabellenausdruckslisten beschrieben.

Wenn SQL Anywhere eine Join-Bedingung zwischen C NATURAL JOIN D und E erstellt, wird nur eine Join-Bedingung erstellt, und daher muss nur eine Fremdschlüsselbeziehung in den Paaren C-E und D-E gefunden werden. Weitere Hinweise finden Sie auch unter Schlüssel-Joins von Tabellenausdrücken ohne Kommas.

Beispiel 2

Folgendes Beispiel enthält einen Schlüssel-Join eines Tabellenausdrucks und eine Liste von Tabellenausdrücken. Das Beispiel liefert die Namen und Abteilungen der Mitarbeiter, die Vertriebsmitarbeiter und gleichzeitig Abteilungsleiter sind.

SELECT DISTINCT Employees.Surname, 
        FK_DepartmentID_DepartmentID.DepartmentName
FROM ( SalesOrders, Departments 
        AS FK_DepartmentID_DepartmentID )
    KEY JOIN ( Employees JOIN Departments AS d
        ON Employees.EmployeeID = d.DepartmentHeadID );

SQL Anywhere generiert zwei Join-Bedingungen:

  • Es gibt genau eine Fremdschlüssel-Beziehung zwischen den Tabellenpaaren "SalesOrders/Employees" und "SalesOrders/d": SalesOrders.SalesRepresentative = Employees.EmployeeID

  • Es gibt genau eine Fremdschlüssel-Beziehung zwischen den Tabellenpaaren "FK_DepartmentID_DepartmentID/Employees" und "FK_DepartmentID_DepartmentID/d": FK_DepartmentID_DepartmentID.DepartmentID = Employees.DepartmentID.

Dieses Beispiel ist gleichwertig zu Folgendem: In der folgenden Version ist es nicht erforderlich, den Korrelationsnamen Departments AS FK_DepartmentID_DepartmentID zu erstellen, da dies nur nötig war, um zu klären, welcher der beiden Fremdschlüssel verwendet werden soll, um "Employees" und "Departments" zu verknüpfen.

SELECT DISTINCT Employees.Surname, 
   Departments.DepartmentName
FROM ( SalesOrders, Departments )
    JOIN ( Employees JOIN Departments AS d
       ON Employees.EmployeeID = d.DepartmentHeadID )
    ON SalesOrders.SalesRepresentative = Employees.EmployeeID
       AND Departments.DepartmentID = Employees.DepartmentID;