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.
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 |
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.
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.
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.
Kommentieren Sie diese Seite in DocCommentXchange. Senden Sie uns Feedback über diese Seite via E-Mail. |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |