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?"
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.
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.
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.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |