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.
Unterabfrage, die einem Vergleichsoperator folgt
Unterabfrage, die auf ANY, ALL oder SOME folgt
Unterabfrage, die IN folgt
Unterabfrage, die EXISTS folgt
![]() |
Kommentieren Sie diese Seite in DocCommentXchange.
|
Copyright © 2013, SAP AG oder ein SAP-Konzernunternehmen. - SAP Sybase SQL Anywhere 16.0 |