Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SAP Sybase SQL Anywhere 16.0 (Deutsch) » SQL Anywhere Server - SQL-Benutzerhandbuch » Abfragen und Datenänderung » Verwendung von Unterabfragen

 

Optimierer: Automatische Konvertierung von Unterabfragen in Joins

Der Abfrageoptimierer erstellt viele der Abfragen, die Unterabfragen verwenden, automatisch neu als Joins. Die Umwandlung erfolgt ohne Eingriff des Benutzers. In diesem Abschnitt wird beschrieben, welche Unterabfragen in Joins umgewandelt werden können, sodass Sie die Performance von Abfragen in Ihrer Datenbank verstehen können.

Die Kriterien, die erfüllt werden müssen, damit eine vielstufige Abfrage mit Joins umgeschrieben werden kann, unterscheiden sich bei den verschiedenen Arten von Operatoren und bei den Strukturen der Abfrage und der Unterabfrage. Wie bereits gesagt: Wenn eine Unterabfrage in der WHERE-Klausel der Abfrage erscheint, hat sie folgendes Format:

SELECT select-list 
FROM table 
WHERE
[NOT] expression comparison-operator ( subquery-expression ) 
| [NOT] expression comparison-operator { ANY | SOME } ( subquery-expression ) 
| [NOT] expression comparison-operator ALL ( subquery-expression ) 
| [NOT] expression IN ( subquery-expression )
| [NOT] EXISTS ( subquery-expression ) 
GROUP BY group-by-expression 
HAVING search-condition

Beispiel: Die Anforderung lautet "Wann haben Frau Clarke und Suresh ihre Bestellungen aufgegeben, und welcher Verkäufer hat sie bedient?" Diese Anforderung kann mit folgender Abfrage abgearbeitet werden:

SELECT OrderDate, SalesRepresentative
FROM SalesOrders
WHERE CustomerID IN (
   SELECT ID
   FROM Customers
   WHERE Surname = 'Clarke' OR GivenName = 'Suresh' );
OrderDate SalesRepresentative
2001-01-05 1596
2000-01-27 667
2000-11-11 467
2001-02-04 195
... ...

Die Unterabfrage ergibt eine Liste von Kunden-IDs, die den beiden Kunden entsprechen, deren Namen in der WHERE-Klausel gelistet sind, und die Hauptabfrage findet die Bestelldaten und den Verkäufer, die den Bestellungen dieser beiden Kunden entsprechen.

Dieselbe Frage kann auch mit Joins beantwortet werden. Nachstehend finden Sie eine andere Form der Abfrage mit einem Join über zwei Tabellen:

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

Diese Form der Abfrage verknüpft die Tabelle "SalesOrders" mit der Tabelle "Customers", um die Bestellungen für die einzelnen Kunden zu finden, und gibt dann nur die Datensätze für "Suresh" und "Clarke" zurück.

 Fall, bei dem eine Unterabfrage funktioniert, aber nicht ein Join
 Siehe auch

Unterabfrage, die einem Vergleichsoperator folgt
Unterabfrage, die auf ANY, ALL oder SOME folgt
Unterabfrage, die IN folgt
Unterabfrage, die EXISTS folgt