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 » Optimierer: Automatische Konvertierung von Unterabfragen in Joins

 

Unterabfrage, die einem Vergleichsoperator folgt

Eine Unterabfrage, die einem Vergleichsoperator (=, >, <, >=, <=, !=, <>, !>, !<) folgt, wird ein Vergleich genannt. Der Optimierer konvertiert diese Unterabfragen in Joins, sofern die Unterabfrage folgende Bedingungen erfüllt:

  • Sie gibt genau einen Wert für jede Zeile in der Hauptabfrage zurück.

  • Sie enthält keine GROUP BY-Klausel.

  • Die Unterabfrage enthält kein Schlüsselwort DISTINCT.

  • Die Unterabfrage ist keine UNION-Abfrage.

  • Die Unterabfrage ist keine Aggregatabfrage.

Beispiel

Nehmen Sie folgende Anforderung an: "Wann wurden die Produkte von Suresh bestellt und von welchem Verkäufer?"

SELECT OrderDate, SalesRepresentative
FROM SalesOrders
WHERE CustomerID = (
   SELECT ID
   FROM Customers
   WHERE GivenName = 'Suresh' );

Diese Abfrage entspricht dem Kriterium und kann daher in eine Abfrage umgewandelt werden, die einen Join benutzt:

SELECT OrderDate, SalesRepresentative
FROM SalesOrders, Customers
WHERE CustomerID=Customers.ID AND 
  ( Surname = 'Clarke' OR GivenName = 'Suresh' );

Die Anforderung "Finde die Produkte, deren Lagermengen weniger als das Doppelte der durchschnittlich bestellten Menge betragen" kann nicht in einen Join umgewandelt werden, da die Unterabfrage eine Aggregatfunktion enthält, nämlich AVG:

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