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 » OLAP-Unterstützung » Fensterfunktionen in SQL Anywhere » Basis-Aggregatfunktionen

 

Beispiel für MAX-Funktion

Korrelierte Unterabfragen eliminieren

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.

Grafischer Plan

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;
Siehe auch