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 Ansichten und abgeleiteten Tabellen

Wenn Sie eine Ansicht oder eine abgeleitete Tabelle in einen Schlüssel-Join einbeziehen, befolgt SQL Anywhere dieselbe grundlegende Prozedur wie bei Tabellen, bis auf die folgenden Unterschiede:

  • Für jeden Schlüssel-Join untersucht SQL Anywhere die Tabellenpaare in der FROM-Klausel der Abfrage und der Ansicht und generiert eine Join-Bedingung für alle Paare, und zwar unabhängig davon, ob die FROM-Klausel in der Ansicht Kommas oder Join-Schlüsselwörter enthält.

  • SQL Anywhere verknüpft die Tabellen basierend auf dem Fremdschlüssel, dessen Rollenname dem Korrelationsnamen der Ansicht oder dem der abgeleiteten Tabelle entspricht.

  • Wenn Sie eine Ansicht oder eine abgeleitete Tabelle in einen Schlüssel-Join einbeziehen, kann die Ansicht oder die Definition der abgeleiteten Tabelle keines der folgenden Elemente enthalten: UNION, INTERSECT, EXCEPT, ORDER BY, DISTINCT, GROUP BY, Aggregatfunktionen, Fensterfunktionen, TOP, FIRST, START AT oder FOR XML. Wenn sie eines dieser Elemente enthält, wird ein Fehler gemeldet. Außerdem kann die abgeleitete Tabelle nicht als rekursiver Tabellenausdruck definiert werden.

    Eine abgeleitete Tabelle funktioniert fast genauso wie eine Ansicht. Der einzige Unterschied besteht darin, dass anstelle der Referenzierung einer vordefinierten Ansicht die Definition für die Tabelle in die Anweisung einbezogen wird.

    Weitere Hinweise zu rekursiven Tabellenausdrücken finden Sie unter Rekursive allgemeine Tabellenausdrücke und RecursiveTable-Algorithmus (RT).

Beispiel 1

Folgende Anweisung verwendet z.B. die Ansicht Ansicht 1.

SELECT *
FROM View1 KEY JOIN B;

Die Definition von Ansicht 1 kann eine der folgenden Anweisungen sein.Sie ergeben jeweils dieselbe Join-Bedingung für B. (Die Ergebnismengen sind unterschiedlich, doch die Join-Bedingung ist jeweils gleich.)

SELECT *
FROM C CROSS JOIN D;

oder

SELECT *
FROM C,D;

oder

SELECT *
FROM C JOIN D ON (C.x = D.y);

Um eine Join-Bedingung für den Schlüssel-Join von Ansicht1 zu generieren, untersucht SQL Anywhere in jedem Fall die Tabellenpaare C-B und D-B. Es wird eine einzige Join-Bedingung erzeugt. Die Join-Bedingung wird basierend auf den Regeln für mehrfache Fremdschlüsselbeziehungen generiert, die unter Schlüssel-Joins von Tabellenausdrücken beschrieben sind, wobei jedoch nach einem Fremdschlüssel gesucht wird, der denselben Namen wie die Korrelation der Ansicht hat (und nicht den einer in der Ansicht referenzierten Tabelle).

Mit jeder der obigen Ansichtsdefinitionen können Sie die Verarbeitung von View1 KEY JOIN B wie folgt interpretieren:

SQL Anywhere generiert eine einzige Join-Bedingung, wobei die Tabellenpaare C-B und D-B berücksichtigt werden. Die Join-Bedingung wird gemäß den Regeln zur Festlegung der Schlüssel-Joins bei mehreren Fremdschlüsselbeziehungen erzeugt:

  • Zunächst wird in C-B und D-B nach einem einzigen Fremdschlüssel gesucht, dessen Rollenname dem Korrelationsnamen der Ansicht entspricht. Wenn genau ein Fremdschlüssel diese Bedingung erfüllt, wird dieser verwendet. Wenn mehrere Fremdschlüssel mit dem Rollennamen der Korrelation der Ansicht vorhanden sind, ist der Join zweideutig, und es wird ein Fehler ausgegeben.

  • Wenn kein Fremdschlüssel mit dem Namen der Korrelation einer Ansicht 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.

Angenommen, die generierte Join-Bedingung lautet: B.y = D.z. Es ist nun möglich, den ursprünglichen Join zu erweitern. Die folgenden Anweisungen sind beispielsweise gleichwertig:

SELECT *
FROM View1 KEY JOIN B;

SELECT *
FROM View1 JOIN B ON B.y = View1.z;

Weitere Hinweise finden Sie unter Schlüssel-Joins bei mehrfachen Fremdschlüsselbeziehungen.

Beispiel 2

Folgende Ansicht enthält alle Mitarbeiterdaten über die Leiter der einzelnen Abteilungen:

CREATE VIEW V AS
SELECT Departments.DepartmentName, Employees.*
FROM Employees JOIN Departments
  ON Employees.EmployeeID = Departments.DepartmentHeadID;

Folgende Abfrage verknüpft die Ansicht mit einem Tabellenausdruck:

SELECT *
FROM V KEY JOIN ( SalesOrders, 
   Departments FK_DepartmentID_DepartmentID );

Die nachstehende Abfrage ist der vorherigen Abfrage gleichwertig:

SELECT *
FROM V JOIN ( SalesOrders, 
   Departments FK_DepartmentID_DepartmentID )
ON ( V.EmployeeID = SalesOrders.SalesRepresentative
AND V.DepartmentID = 
    FK_DepartmentID_DepartmentID.DepartmentID );