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

 

Unterabfragen anstelle von Joins verwenden

Angenommen, Sie benötigen eine chronologische Liste der Aufträge und die Angabe der Firma, die sie erteilt hat, doch Sie möchten den Firmennamen anstelle der Kunden-ID erhalten. Um dieses Ergebnis zu erhalten, verwenden Sie einen Join.

Join verwenden

Um die Auftrags-ID, das Datum und den Firmennamen aller Aufträge seit Anfang 2001 aufzulisten, führen Sie folgende Abfrage aus:

SELECT SalesOrders.ID,
            SalesOrders.OrderDate,
            Customers.CompanyName
FROM SalesOrders
   KEY JOIN Customers
WHERE OrderDate > '2001/01/01'
ORDER BY OrderDate;
Unterabfrage verwenden

Folgende Anweisung liefert dasselbe Ergebnis, wenn sie anstelle eines Joins eine Unterabfrage verwendet:

SELECT SalesOrders.ID,
   SalesOrders.OrderDate,
   (  SELECT CompanyName FROM Customers
       WHERE Customers.ID = SalesOrders.CustomerID )
FROM SalesOrders
WHERE OrderDate > '2001/01/01'
ORDER BY OrderDate;

Die Unterabfrage bezieht sich auf die Spalte "CustomerID" in der Auftragstabelle "SalesOrders", obwohl die Tabelle "SalesOrders" kein Bestandteil der Unterabfrage ist. Stattdessen bezieht sich die Spalte "SalesOrders.CustomerID" auf die Tabelle "SalesOrders" im Hauptteil der Anweisung.

Eine Unterabfrage kann immer dann anstelle eines Joins verwendet werden, wenn nur eine Spalte aus der anderen Tabelle benötigt wird. (Beachten Sie, dass Unterabfragen nur eine Spalte zurückgeben können.) In diesem Beispiel benötigen Sie nur die Spalte "CompanyName". Daher kann der Join in eine Unterabfrage geändert werden.

Outer-Joins verwenden

Um alle Kunden im US-Bundesstaat Washington zusammen mit ihren letzten Auftrags-IDs aufzulisten, führen Sie folgende Abfrage aus:

SELECT  CompanyName, State,
   ( SELECT MAX( ID )
       FROM SalesOrders
      WHERE SalesOrders.CustomerID = Customers.ID )
FROM Customers
WHERE State = 'WA';
CompanyName State MAX(SalesOrders.ID)
Custom Designs WA 2547
It's a Hit! WA (NULL)

Die Firma "It's a Hit!" hat keine Aufträge erteilt, und die Unterabfrage gibt für diesen Kunden NULL zurück. Firmen, die keine Aufträge erteilt haben, werden bei der Verwendung eines Inner-Joins nicht aufgelistet.

Sie können auch einen Outer-Join explizit festlegen. In diesem Fall ist eine GROUP BY-Klausel erforderlich.

SELECT CompanyName, State,
   MAX( SalesOrders.ID )
FROM Customers
   KEY LEFT OUTER JOIN SalesOrders
WHERE State = 'WA'
GROUP BY CompanyName, State;