Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Korrelierte Unterabfragen

Bei einem geschachtelten Abfrage-Ausdruck heißt eine innere Unterabfrage korrelierte Unterabfrage, wenn sie sich auf Spalten einer äußeren Tabelle bezieht, das heißt einer Tabelle, die in einem der äußeren Abfrage-Ausdrücke verwendet wird.

Mit Hilfe von korrelierten Unterabfragen können Sie Beziehungen zwischen den Spaltenwerten einer Spalte bestimmen.

Beispiel

Bei einer Personentabelle mit einer Spalte, die für jede Person das Alter enthält, können Sie feststellen, welche Personen genau das Durchschnittsalter haben (siehe auch Beispiel unten).

Nicht korrelierte Unterabfragen brauchen nur einmal ausgewertet zu werden. Korrelierte Unterabfragen müssen mehrfach für unterschiedliche Sätze der äußeren Tabelle ausgewertet werden. Ist die Unterabfrage geschachtelt, erfolgt die Auswertung von innen nach außen.


Beispiele


Bei der folgenden Abfrage handelt es sich um eine korrelierte Unterabfrage:

SELECT DISTINCT atext FROM auftrag WHERE EXISTS

(SELECT * FROM leistung WHERE leistung.anr = auftrag.anr)

Die innere Unterabfrage in der WHERE-Klausel bezieht sich auf die Spalte ANR der Tabelle AUFTRAG in der äußeren Abfrage. AUFTRAG.ANR wird auch Außenreferenz genannt, da die Spalte eine Tabelle in der äußeren Abfrage referenziert. Die Abfrage wird ausgewertet, indem für den ersten Satz der Tabelle AUFTRAG der Wert von AUFTRAG.ANR bestimmt wird und die Unterabfrage mit diesem Wert ausgewertet und das Ergebnis in die äußere Abfrage eingesetzt wird. Anschließend wird dies für den zweiten Wert von AUFTRAG.ANR wiederholt, usw. Die Abfrage liefert folgende Ergebnistabelle:

atext

Mitarbeiterschulung

Datenbank-Entwurf Kunden

Serienbrief-Einweisung


Für jeden Auftrag aus der Tabelle LEISTUNG die Leistungen heraussuchen, die über der durchschnittlichen Leistung für diesen Auftrag liegen:

SELECT l1.lnr, l1.anr, l1.lanz*l1.lsatz 
   FROM leistung l1
   WHERE l1.lanz*l1.lsatz > 
   (SELECT AVG (l2.lanz*l2.lsatz) FROM leistung l2 WHERE l1.anr=l2.anr)


Abfrage-Ausdrücke können beliebig geschachtelt werden:

SELECT firma, knr FROM kunde WHERE knr IN
   (SELECT knr FROM auftrag WHERE anr IN
       (SELECT anr FROM leistung WHERE (lsatz*lanz) IN
           (SELECT MAX(lsatz*lanz) FROM leistung)))

Da es sich um nicht korrelierte Unterabfragen handelt, wird jede Unterabfrage einmal ausgewertet, das Ergebnis wird jeweils in die äußere Abfrage eingesetzt.

Ergebnistabelle

firma

knr

Foreign Ltd.

106