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.
Unterabfrage, die einem Vergleichsoperator folgt
Unterabfrage, die ANY, ALL oder SOME folgt
Unterabfrage, die IN folgt
Unterabfrage, die EXISTS folgt
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |