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 » Unterabfragen verwenden

 

Unterabfragen in der HAVING-Klausel

Obwohl Unterabfragen normalerweise als Suchbedingungen in der WHERE-Klausel vorkommen, werden sie manchmal auch in der HAVING-Klausel einer Abfrage benutzt. Wenn eine Unterabfrage in der HAVING-Klausel erscheint, wird sie wie jeder andere Ausdruck in der HAVING-Klausel als Teil der Zeilengruppenauswahl benutzt.

Nachfolgend finden Sie eine Anforderung, die auf natürliche Weise zu einer Abfrage mit einer Unterabfrage in der HAVING-Klausel führt: "Die durchschnittliche Lagermenge welcher Artikel ist mehr als das Doppelte der durchschnittlichen Anzahl der pro Kunde bestellten Artikel?"

Beispiel
SELECT Name, AVG( Quantity )
FROM Products
GROUP BY Name
HAVING AVG( Quantity ) > 2* (
   SELECT AVG( Quantity )
   FROM SalesOrderItems 
 );
Name AVG( Products.Quantity )
Baseball Cap 62.000000
Shorts 80.000000
Tee Shirt 52.333333

Die Abfrage wird folgendermaßen ausgeführt:

  • Die Unterabfrage berechnet die durchschnittliche Menge der Artikel in der Tabelle "SalesOrderItems".

  • Die Hauptabfrage durchläuft dann die Tabelle "Products", berechnet die Durchschnittsproduktmenge und gruppiert die Artikel nach Produktnamen.

  • Die HAVING-Klausel prüft, ob jede Durchschnittsmenge mehr als das Doppelte der Menge ist, die von der Unterabfrage gefunden wurde. Wenn dies so ist, gibt die Hauptabfrage diese Zeilengruppe zurück, sonst nicht.

  • Die SELECT-Klausel ergibt eine Summenzeile für jede Gruppe und zeigt die Namen der einzelnen Artikel und ihre durchschnittliche Lagermenge an.

Sie können auch äußere Referenzen in einer HAVING-Klausel verwenden, wie dies in der nachstehenden Abfrage gezeigt wird, die eine geringfügige Abweichung der oben gezeigten Anforderung darstellt.

Beispiel

In diesem Beispiel werden die Produkt-ID-Nummern und die Zeilen-ID-Nummern der Produkte gesucht, deren durchschnittlich bestellte Mengen mehr als die Hälfte der Lagermengen dieser Produkte betragen.

SELECT ProductID, LineID
FROM SalesOrderItems
GROUP BY ProductID, LineID
HAVING 2* AVG( Quantity ) > (
   SELECT Quantity
   FROM Products
   WHERE Products.ID = SalesOrderItems.ProductID );
ProductID LineID
601 3
601 2
601 1
600 2
... ...

In diesem Beispiel muss die Unterabfrage die Lagermenge des Produkts ergeben, das der Zeilengruppe entspricht, die von der HAVING-Klausel getestet wurde. Die Unterabfrage wählt Datensätze für diesen Artikel aus, indem die äußere Referenz "SalesOrderItems.ProductID". verwendet wird.

Eine Unterabfrage mit einem Vergleich gibt einen einzelnen Wert zurück

Diese Abfrage benutzt den Vergleich ">" und nimmt an, dass die Unterabfrage exakt einen Wert zurückgeben muss. In diesem Fall trifft das zu. Da das ID-Feld der Tabelle "Products" ein Primärschlüssel ist, gibt es in der Tabelle "Products" jeweils nur einen Datensatz für eine bestimmte Produkt-ID.