Unterabfragen mit EXISTS
Unterabfragen, die mit dem EXISTS-Schlüsselwort eingeleitet werden, dienen als Test auf das Vorhandensein bestimmter Daten. Die WHERE-Klausel der äußeren Abfrage testet, ob die von der Unterabfrage zurückgegebenen Zeilen vorhanden sind. Die Unterabfrage gibt keine tatsächlichen Daten zurück, sondern lediglich den Wert TRUE oder FALSE.
Die Syntax einer mit EXISTS
eingeleiteten Unterabfrage lautet wie folgt:
WHERE [NOT] EXISTS (subquery)
Die folgende Abfrage sucht die Namen aller Produkte, die sich in der Wheels
-Unterkategorie befinden:
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE EXISTS
(SELECT *
FROM Production.ProductSubcategory
WHERE ProductSubcategoryID =
Production.Product.ProductSubcategoryID
AND Name = 'Wheels')
Dies ist das Resultset.
Name
--------------------------------------------------
LL Mountain Front Wheel
ML Mountain Front Wheel
HL Mountain Front Wheel
LL Road Front Wheel
ML Road Front Wheel
HL Road Front Wheel
Touring Front Wheel
LL Mountain Rear Wheel
ML Mountain Rear Wheel
HL Mountain Rear Wheel
LL Road Rear Wheel
ML Road Rear Wheel
HL Road Rear Wheel
Touring Rear Wheel
(14 row(s) affected)
Sehen Sie sich die Namen der einzelnen Produkte der Reihe nach an, um die Ergebnisse dieser Abfrage zu verstehen. Veranlasst dieser Wert die Unterabfrage zur Rückgabe mindestens einer Zeile? Bewirkt die Abfrage also, dass der Test auf Vorhandensein zu TRUE ausgewertet wird?
Beachten Sie, dass sich mit EXISTS eingeleitete Unterabfragen in folgender Hinsicht geringfügig von anderen Unterabfragen unterscheiden:
- Vor dem EXISTS-Schlüsselwort befindet sich weder ein Spaltenname noch eine Konstante oder ein anderer Ausdruck.
- Die Auswahlliste einer mit EXISTS eingeleiteten Unterabfrage besteht fast immer aus einem Sternchen (*). Spaltennamen müssen nicht aufgelistet werden, da lediglich getestet wird, ob Zeilen vorhanden sind, die die in der Unterabfrage angegebenen Bedingungen erfüllen.
Das EXISTS-Schlüsselwort ist wichtig, da es häufig keine alternative Formulierung ohne Unterabfrage gibt. Manche mit EXISTS erstellten Abfragen können nicht auf andere Weise ausgedrückt werden. Viele Abfragen können jedoch mithilfe von IN oder einem durch ANY oder ALL geänderten Vergleichsoperator ähnliche Ergebnisse erzielen.
Die oben gezeigte Abfrage kann z. B. mithilfe von IN
ausgedrückt werden:
USE AdventureWorks;
GO
SELECT Name
FROM Production.Product
WHERE ProductSubcategoryID IN
(SELECT ProductSubcategoryID
FROM Production.ProductSubcategory
WHERE Name = 'Wheels')