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 testen

 

Unterabfragen und der EXISTS-Test

Unterabfragen, die im Unterabfrage-Vergleichstest und im Test der Zugehörigkeit zu einer Gruppe verwendet werden, geben Datenwerte aus der Tabelle der Unterabfrage zurück. Es gibt Situationen, in denen Sie herausfinden wollen, ob die Unterabfrage irgendein Ergebnis zurückgibt, und nicht welche Ergebnisse. Der Existenztest (EXISTS) prüft, ob eine Unterabfrage eine Zeile mit Abfrageergebnissen ausgibt. Wenn die Unterabfrage eine oder mehrere Zeilen mit Ergebnissen produziert, gibt der EXISTS-Test den Wert TRUE zurück. Andernfalls wird der Wert FALSE zurückgegeben.

Beispiel

In diesem Beispiel sehen wir eine Anforderung, die mit einer Unterabfrage ausgedrückt wird: "Welche Kunden haben nach dem 13.07.01 Bestellungen aufgegeben?"

SELECT GivenName, Surname
FROM Customers
WHERE EXISTS (
   SELECT *
   FROM SalesOrders
   WHERE ( OrderDate > '2001-07-13' ) AND
         ( Customers.ID = SalesOrders.CustomerID ) );
GivenName Surname
Almen de Joie
Grover Pendelton
Ling Ling Andrews
Bubba Murphy
Erklärung des Existenztests

Hier prüft die Unterabfrage für jede Zeile in der Tabelle "Customers", ob die Kunden-ID zu einer Bestellung nach dem 13.07.01 gehört.Wenn dies der Fall ist, selektiert die Abfrage die Vor- und Nachnamen des Kunden aus der Haupttabelle.

Der EXISTS-Test benutzt die Ergebnisse der Unterabfrage nicht für die Weiterverarbeitung. Er prüft nur, ob die Unterabfrage Zeilen selektieren wird. Somit liefert der Existenztest für die beiden folgenden Unterabfragen dieselben Ergebnisse: Dies sind Unterabfragen, die nicht für sich alleine verarbeitet werden können, da sie sich auf die Tabelle "Customers" beziehen, die Teil der Hauptabfrage ist, nicht aber Teil der Unterabfrage.

Weitere Hinweise finden Sie unter Korrelierte und nichtkorrelierte Unterabfragen.

SELECT *
FROM Customers, SalesOrders
WHERE ( OrderDate > '2001-07-13' ) AND 
      ( Customers.ID = SalesOrders.CustomerID )

SELECT OrderDate
FROM Customers, SalesOrders
WHERE ( OrderDate > '2001-07-13' ) AND 
      ( Customers.ID = SalesOrders.CustomerID );

Es ist unerheblich, welche Spalten aus der Tabelle "SalesOrders" in der SELECT-Anweisung erscheinen, es wird aber üblicherweise die Schreibweise "SELECT *" verwendet.

Existenztest negieren

Sie können die Logik des EXISTS-Tests mit NOT EXISTS umkehren. In diesem Fall gibt der Test TRUE zurück, wenn die Unterabfrage keine Zeilen ergibt, und FALSE, wenn Zeilen gefunden werden.

Korrelierte Unterabfragen

Sie haben vielleicht festgestellt, dass die Unterabfrage eine Referenz auf die ID-Spalte der Tabelle "Customers" enthält. Eine Referenz auf Spalten oder Ausdrücke in der oder den Haupttabellen wird äußere Referenz genannt, und die Unterabfrage wird in diesem Fall als korelliert bezeichnet. Konzeptgemäß verarbeitet SQL die oben genannte Abfrage, indem die Tabelle "Customers" durchsucht und die Unterabfrage für jeden Kunden abgearbeitet wird. Wenn das Bestelldatum in der Tabelle "SalesOrders" nach dem 13.07.01 liegt und die Kunden-ID in den Tabellen "Customers" und "SalesOrders" zueinander passen, werden die Vor- und Nachnamen der Kunden aus der Tabelle "Customers" angezeigt. Da die Unterabfrage die Hauptabfrage referenziert, gibt die Unterabfrage in diesem Abschnitt - im Unterschied zu den Unterabfragen der vorherigen Abschnitte - einen Fehler aus, wenn Sie versuchen, die Unterabfrage allein auszuführen.