Erste Seite Zurück Weiter Letzte Seite Übersicht Grafik
Unterabfragen
Unterabfragen
- SELECT ....
FROM Tabelle1
WHERE Tabelle1.A =
(SELECT B FROM Tabelle2 WHERE C = Wert)
oder: .... WHERE Tabelle1.A IN (SELECT X ... )
Unterabfragen sind verschachtelbar
typisch: Aggregatfunktionen für Vergleichswerte
korrellierte Unterabfragen
Notizen:
Von Unterabfragen spricht man, wenn mitten in einem Select ein weiteres Select vorkommt. Das kann z.B. so aussehen:
SELECT ....
FROM Tabelle1
WHERE Tabelle1.A =
(SELECT B FROM Tabelle2 WHERE C = Wert)
oder: .... WHERE Tabelle1.A IN (SELECT ... )
Achtung: das ist nicht dasselbe IN wie bei IN ('A', 'B', 'C')
die Unterabfrage muss genau 1 Feld liefern
Unterabfragen sind verschachtelbar
Die Unterabfrage kann auch in einer anderen als der
WHERE-Klausel auftauchen, z.B:
SELECT Feld1, Feld2, ....
FROM Tabelle1 AS t INNER JOIN
(SELECT Feld3, Feld4,...
FROM View2
WHERE ...) AS s ON
t.Feld1 = s.Feld
Unterabfragen können den jeweils von der "äußeren" Abfrage behandelten Datensatz referenzieren. Das nennt man "korrelierte Unterabfrage":
SELECT Feld1, Feld2,
(SELECT Feld3
FROM View2 v
WHERE v.Feld3 = t.Feld1) Feld4, Feld5,...
FROM Tabelle1 t
Die Unterabfrage ist "korreliert", weil über "t" ein Zusammenhang mit der Hauptabfrage gebildet wird. Die Auswertung der Unterabfrage findet für jede Zeile (=jeden Wert aus Feld1 in Tabelle1) statt. In diesem Beispiel muss die Unterabfrage so formuliert sein, dass sie nur einen einzigen Wert liefert (1 Spalte, 1 Zeile), denn sie tritt in der SELECT-Klausel auf.
Das kann bei einer bestimmten Art von Problem praktisch sein. Z.B.: 1:n – Beziehung zwischen Customers & Orders. Projizieren Sie die Daten der Kunden gejoined mit den Daten ihrer jeweils letzten Aufträge:
-- Alle Kunden mit ihrem letzten Auftrag
select *
from Customers c inner join
Orders o on
o.CustomerID = c.CustomerID
where Orderdate = (
select max(OrderDate)
from Orders
where CustomerID = o.CustomerID);
Hier tritt die Unterabfrage in der WHERE-Klausel auf.
Wir haben es mit einem geschachtelten Subselect (also insg. 3) zu tun: einem äußeren, einem Subselect & einem inneren Subselect. Das Select projiziert nur die Kundendaten & letzte AuftragsID. Beachten Sie, dass das Subselect ganz normal einen Spaltenalias zugewiesen bekommt. Das Subselect liefert die letzte ID (falls es mehrere gibt) aller Aufträge eines Kunden (deswegen ist es korreliert) und benützt selbst ein Subselect, welches das letzte Auftragsdatum für jeden Kunden (ebenfalls korreliert) feststellt.