In manchen Situationen kann es erforderlich sein, einen bestimmten Spaltenwert mit einem maximalen oder minimalen Wert zu vergleichen. Solche Abfragen werden oft in Form von verschachtelten Abfragen gebildet, die ein korreliertes Attribut enthalten (auch als äußere Referenz bezeichnet). Im Beispiel der folgenden Abfrage werden alle Bestellungen einschließlich der Produktdaten aufgeführt, bei denen der vorhandene Bestand nicht ausreicht, um die maximale Einzelbestellung für dieses Produkt zu erfüllen:
SELECT o.ID, o.OrderDate, p.* FROM SalesOrders o, SalesOrderItems s, Products p WHERE o.ID = s.ID AND s.ProductID = p.ID AND p.Quantity < ( SELECT MAX( s2.Quantity ) FROM SalesOrderItems s2 WHERE s2.ProductID = p.ID ) ORDER BY p.ID, o.ID; |
Der grafische Plan für diese Abfrage wird in der Plananzeige angezeigt, wie unten dargestellt. Beachten Sie, wie der Abfrageoptimierer diese verschachtelte Abfrage in einen Join transformiert hat, der die Tabellen "Products" und "SalesOrders" mit einer abgeleiteten Tabelle mit dem Korrelationsnamen DT verknüpft, in der eine Fensterfunktion enthalten ist.
Sie können solche Abfragen mit einer Fensterfunktion bilden, statt sich darauf zu verlassen, dass der Optimierer die korrelierte Unterabfrage in einen Join mit einer abgeleiteten Tabelle transformiert, was wegen der Komplexität der semantischen Analyse nur in einfachen Fällen möglich ist.
SELECT order_qty.ID, o.OrderDate, p.* FROM ( SELECT s.ID, s.ProductID, MAX( s.Quantity ) OVER ( PARTITION BY s.ProductID ORDER BY s.ProductID ) AS max_q FROM SalesOrderItems s ) AS order_qty, Products p, SalesOrders o WHERE p.ID = ProductID AND o.ID = order_qty.ID AND p.Quantity < max_q ORDER BY p.ID, o.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 |