Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Abfrage und Änderung von Daten » Verwendung von Unterabfragen

 

Korrelierte und nichtkorrelierte Unterabfragen

Eine Unterabfrage kann eine Referenz auf ein Objekt enthalten, das in einer übergeordneten Anweisung definiert ist. Dies wird als äußere Referenz bezeichnet. Eine Unterabfrage, die eine äußere Referenz enthält, wird als korrelierte Unterabfrage bezeichnet. Korrelierte Unterabfragen können nicht unabhängig von der äußeren Abfrage ausgewertet werden, weil die Unterabfrage Werte der übergeordneten Anweisung verwendet. Das heißt, dass die Unterabfrage für jede Zeile in der übergeordneten Anweisung durchgeführt wird. Dadurch hängen die Ergebnisse der Unterabfrage von der aktiven Zeile ab, die in der übergeordneten Anweisung ausgewertet wird.

Die Unterabfrage in der untenstehenden Anweisung liefert beispielsweise einen Wert, der von der aktiven Zeile in der Tabelle "Products" abhängig ist:

SELECT Name, Description
FROM Products
WHERE Quantity < 2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems
   WHERE Products.ID=SalesOrderItems.ProductID );

In diesem Beispiel ist die Spalte "Products ID" in dieser Unterabfrage die äußere Referenz. Die Abfrage holt die Namen und Beschreibungen der Produkte, deren Lagerbestand geringer als das Doppelte der durchschnittlich bestellten Menge des von der WHERE-Klausel in der Hauptabfrage getesteten Produkts ist. Die Unterabfrage führt dies durch, indem sie die Tabelle "SalesOrderItems" durchsucht. Die Spalte "Products.ID" in der WHERE-Klausel der Unterabfrage bezieht sich jedoch auf eine Spalte in der Tabelle aus der FROM-Klausel der Haupt-Abfrage, und nicht der Unterabfrage. Wenn der Datenbankserver durch die einzelnen Zeilen der Tabelle "Products" geht, verwendet er den ID-Wert der aktuellen Zeile bei der Auswertung der WHERE-Klausel der Unterabfrage.

Eine Abfrage wird ohne Fehler ausgeführt, wenn eine in einer Unterabfrage referenzierte Spalte in der Tabelle nicht existiert, die von der FROM-Klausel der Unterabfrage referenziert wird, hingegen in einer Tabelle vorhanden ist, die von der FROM-Klausel der äußeren Abfrage referenziert wird. SQL Anywhere qualifiziert implizit die Spalte in der Unterabfrage mit dem Tabellennamen der äußeren Abfrage.

Eine Unterabfrage, die keine Referenzen auf Objekte in einer übergeordneten Anweisung enthält, wird nichtkorrelierte Unterabfrage genannt. Im untenstehenden Beispiel berechnet die Unterabfrage genau einen Wert: die durchschnittliche Menge aus der Tabelle "SalesOrderItems". Bei der Auswertung der Abfrage berechnet der Datenbankserver den Wert nur einmal und vergleicht jeden Wert im Feld "Quantity" der Tabelle "Products" damit, um zu ermitteln, ob die entsprechende Zeile ausgewählt werden soll.

SELECT Name, Description
FROM Products
WHERE Quantity <  2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems );