Gewisse Prädikate können Subqueries enthalten. Diese Subqueries können wiederum Subqueries enthalten, usw. Eine Subquery, die Subqueries enthält, ist von höherer Stufe als die in ihr enthaltenen Subqueries.
· In der Suchbedingung einer Subquery dürfen Spaltennamen auftreten, die zu Tabellen gehören, die in höheren Stufen in der FROM-Klausel enthalten sind. Eine Subquery dieser Art heißt Correlated Subquery.
· Tabellen, die in dieser Weise in Subqueries verwendet werden, werden als Correlated Tables bezeichnet. Mehr als 16 Correlated Tables sind in einer SQL-Anweisung nicht zulässig.
· Spalten, die derart in Subqueries verwendet werden, heißen Correlated Columns. Ihre Anzahl in einer SQL-Anweisung ist auf 64 beschränkt.
Wenn der qualifizierende Tabellen- oder Referenzname nicht eindeutig eine Tabelle höherer Stufe bezeichnet, wird unter diesen nicht eindeutigen Tabellen die Tabelle niedrigster Stufe genommen.
Wird der Spaltenname nicht durch den Tabellennamen oder den Referenznamen qualifiziert, wird in den Tabellen höherer Stufen gesucht. Der Spaltenname muß dann in allen Tabellen der FROM-Klausel, zu der die gefundene Tabelle gehört, eindeutig sein.
Wird eine Correlated Subquery verwendet, gehen die Werte einer oder mehrerer Spalten einer Zwischenergebniszeile einer höheren Stufe in die Suchbedingung einer Subquery niederer Stufe ein, wobei das Ergebnis der Subquery für die endgültige Qualifikation der Zwischenergebniszeile der höheren Stufe verwendet wird.
Beispieltabellen hotel und room.
Zu jedem Ort sind alle Hotelnamen gesucht, deren Einzelzimmerpreise unter den
Durchschnittspreisen des jeweiligen Ortes liegen.
SELECT name, city FROM hotel X, room
WHERE X.hno = room.hno AND room.roomtype = 'SINGLE' AND room.price <
(SELECT AVG(room.price) FROM hotel, room
WHERE hotel.hno = room.hno AND hotel.city = X.city AND room.roomtype = 'SINGLE' )
Name |
City |
Eight Avenue |
Los Angeles |
Sunshine |
Los Angeles |
Atlantic |
New York |