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 EXISTS folgt

Der Optimierer konvertiert eine Unterabfrage, die einem Schlüsselwort folgt, nur, falls folgende Bedingungen erfüllt werden:

  • Die Hauptabfrage enthält keine GROUP BY-Klausel und ist keine Aggregatabfrage, oder die Unterabfrage gibt genau einen Wert zurück.

  • Die Verbindung 'EXISTS (Unterabfrage)' wird nicht negiert.

  • Die Unterabfrage ist korreliert, d.h. sie enthält eine äußere Referenz.

Beispiel

Die Anforderung "Welche Kunden haben nach dem 13.07.01 Bestellungen aufgegeben?", die in einer Abfrage formuliert werden kann, deren nicht-negierte Unterabfrage die äußere Referenz Customers.ID = SalesOrders.CustomerID enthält, könnte durch den folgenden Join dargestellt werden:

SELECT GivenName, Surname
FROM Customers
WHERE EXISTS (
   SELECT *
   FROM SalesOrders
   WHERE ( OrderDate > '2001-07-13' ) AND
         ( Customers.ID = SalesOrders.CustomerID ) );

Durch das Schlüsselwort EXISTS wird der Datenbankserver angewiesen, nach leeren Ergebnismengen zu suchen. Wenn INNER-Joins verwendet werden, zeigt der Datenbankserver automatisch nur die Zeilen an, in denen sich Daten von allen Tabellen befinden, die in der FROM-Klausel enthalten sind. Diese Abfrage gibt daher dieselben Zeilen zurück wie diejenige ohne die Unterabfrage:

SELECT DISTINCT GivenName, Surname
FROM Customers, SalesOrders
WHERE ( SalesOrders.OrderDate > '2001-07-13' ) AND 
      ( Customers.ID = SalesOrders.CustomerID );