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 » Spezielle Joins

 

Joins, die sich aus APPLY-Ausdrücken ergeben

Ein APPLY-Ausdruck bietet eine einfache Möglichkeit, Joins anzugeben, bei denen die rechte Seite von der linken Seite abhängig ist. Verwenden Sie zum Beispiel einen APPLY-Ausdruck, um eine Prozedur oder eine abgeleitete Tabelle für jede Zeile in einem Tabellenausdruck auszuwerten. APPLY-Ausdrücke werden in die FROM-Klausel einer SELECT-Anweisung platziert und erlauben keine Verwendung einer ON-Klausel.

APPLY verbindet Zeilen von mehreren Quellen, ähnlich wie JOIN, nur dass Sie bei APPLY keine ON-Bedingung angeben können. Der Hauptunterschied zwischen APPLY und JOIN besteht darin, dass sich die rechte Seite von APPLY abhängig von der aktuellen Zeile auf der linken Seite ändern kann. Für beide Zeilen auf der linken Seite wird die rechte Seite neu berechnet, und die resultierenden Zeilen werden mit der Zeile links verknüpft. Falls eine Zeile auf der linken Seite mehr als eine Zeile rechts zurückgibt, kommt die linke Seite in den Ergebnissen so oft vor, wie es von rechts zurückgegebene Zeilen gibt.

Es gibt zwei APPLY-Typen, die Sie angeben können: CROSS APPLY und OUTER APPLY. CROSS APPLY gibt nur Zeilen auf der linken Seite zurück, die Ergebnisse auf der rechten Seite produzieren. OUTER APPLY gibt alle Zeilen zurück, die CROSS APPLY zurückgibt, sowie alle Zeilen auf der linken Seite, für die die rechte Seite keine Zeilen zurückgibt (indem NULL-Werte für die rechte Seite geliefert werden).

Die Syntax eines APPLY-Ausdrucks lautet folgendermaßen:

Tabellenausdruck { CROSS | OUTER } APPLY Tabellenausdruck
Beispiel

Das folgende Beispiel erstellt eine Prozedur, EmployeesWithHighSalary, die als Eingabe eine Abteilungs-ID nimmt und die Namen aller Mitarbeiter in dieser Abteilung zurückgibt, deren Gehalt größer als US$80.000 ist.

CREATE PROCEDURE EmployeesWithHighSalary( IN dept INTEGER )
  RESULT ( Name LONG VARCHAR )
   BEGIN
    SELECT E.GivenName || ' ' || E.Surname 
        FROM Employees E
        WHERE E.DepartmentID = dept AND E.Salary > 80000;
   END;

Die folgende Abfrage verwendet OUTER APPLY, um die Departments-Tabelle mit den Ergebnissen der EmployeesWithHighSalary-Prozedur zu verknüpfen und die Namen aller Mitarbeiter in den einzelnen Abteilungen zurückzugeben, deren Gehalt größer als US$80.000 ist. Die Abfrage gibt Zeilen mit NULL auf der rechten Seite zurück, was angibt, dass es in den entsprechenden Abteilungen keine Mitarbeiter gibt, deren Gehalt größer als US$80.000 ist.

SELECT D.DepartmentName, HS.Name
    FROM Departments D
    OUTER APPLY EmployeesWithHighSalary( D.DepartmentID ) AS HS;
DepartmentName Name
R & D Kim Lull
R & D David Scott
R & D John Sheffield
Sales Moira Kelly
Finance Mary Anne Shea
Marketing NULL
Shipping NULL

Die nächste Abfrage verwendet CROSS APPLY, um die Departments-Tabelle mit den Ergebnissen der EmployeesWithHighSalary-Prozedur zu verknüpfen. Beachten Sie, dass Zeilen mit NULL auf der rechten Seite nicht aufgenommen wurden.

SELECT D.DepartmentName, HS.Name
    FROM Departments D
    CROSS APPLY EmployeesWithHighSalary( D.DepartmentID ) AS HS;
DepartmentName Name
R & D Kim Lull
R & D David Scott
R & D John Sheffield
Sales Moira Kelly
Finance Mary Anne Shea

Die nächste Abfrage gibt dieselben Ergebnisse wie die vorherige Abfrage zurück, verwendet aber eine abgeleitete Tabelle als rechte Seite von CROSS APPLY.

SELECT D.DepartmentName, HS.Name
   FROM Departments D
    CROSS APPLY (
        SELECT E.GivenName || ' ' || E.Surname
            FROM Employees E
            WHERE E.DepartmentID = D.DepartmentID AND E.Salary > 80000
    ) HS( Name );
Siehe auch