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

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 Auswahlliste 
FROM Tabelle 
WHERE
[NOT] Ausdruck Vergleichsoperator ( Unterabfragen_Ausdruck ) 
| [NOT] Ausdruck Vergleichsoperator { ANY | SOME } ( Unterabfragen_Ausdruck ) 
| [NOT] Ausdruck Vergleichsoperator ALL ( Unterabfragen_Ausdruck ) 
| [NOT] Ausdruck IN ( Unterabfragen_Ausdruck )
| [NOT] EXISTS ( Unterabfragen_Ausdruck ) 
GROUP BY Group-By-Ausdruck 
HAVING Suchbedingung

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

Es gibt Fälle, bei denen eine Unterabfrage funktioniert, aber ein Join es nicht tut. Zum Beispiel:

SELECT Name, Description, Quantity
FROM Products
WHERE Quantity <  2 * (
   SELECT AVG( Quantity )
   FROM SalesOrderItems );
Name Description Quantity
Tee Shirt Tank Top 28
Baseball Cap Wool cap 12
Visor Cloth Visor 36
... ... ...

In diesem Fall ist die innere Abfrage eine Zusammenfassung, die äußere Abfrage hingegen nicht, sodass die beiden Abfragen nicht in einem einfachen Join kombiniert werden können.

Siehe auch

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