Operatoren für Unterabfragen¶
Unter diesem Thema finden Sie Referenzinformationen zu den von Snowflake unterstützten Unterabfrageoperatoren. Eine Unterabfrage ist eine Abfrage in einer anderen Abfrage.
Unter diesem Thema:
ALL / ANY¶
Die Schlüsselwörter ALL und ANY können verwendet werden, um einen Vergleichsoperator auf die Werte anzuwenden, die von einer Unterabfrage erzeugt werden (die mehr als eine Zeile zurückgeben kann).
Syntax¶
<expr> comparisonOperator { ALL | ANY} ( <query> )
Wobei:
comparisonOperator ::= { = | != | > | >= | < | <= }
Nutzungshinweise¶
Der Ausdruck wird mit dem Operator und jedem Wert verglichen, den die Unterabfrage zurückgibt:
Wenn ANY angegeben ist, lautet das Ergebnis TRUE, wenn eine Zeile der Unterabfrage die Bedingung erfüllt, andernfalls wird FALSE zurückgegeben.
Wenn ALL angegeben ist, lautet das Ergebnis TRUE, wenn jede Zeile der Unterabfrage die Bedingung erfüllt, andernfalls wird FALSE zurückgegeben.
ANY/ALL-Unterabfragen werden derzeit nur in einer WHERE-Klausel unterstützt.
ANY/ALL-Unterabfragen können einem OR-Operator nicht als Argument angezeigt werden.
Die Unterabfrage darf nur einen Eintrag in der SELECT-Liste enthalten.
Beispiele¶
Verwenden Sie eine != ALL
-Unterabfrage, um Abteilungen zu ermitteln, die keine Mitarbeiter haben:
SELECT department_id FROM departments d WHERE d.department_id != ALL (SELECT e.department_id FROM employees e);
[ NOT ] EXISTS¶
Eine EXISTS-Unterabfrage ist ein boolescher Ausdruck, der in einer WHERE- oder HAVING-Klausel oder in einer beliebigen Funktion, die sich auf boolesche Ausdrücke anwenden lässt, verwendet werden kann:
Ein EXISTS-Ausdruck wird als TRUE ausgewertet, wenn von der Unterabfrage Zeilen erzeugt werden.
Ein NOT EXISTS-Ausdruck wird als TRUE ausgewertet, wenn von der Unterabfrage keine Zeilen erzeugt werden.
Syntax¶
[ NOT ] EXISTS ( <query> )
Nutzungshinweise¶
Korrelierte EXISTS-Unterabfragen werden derzeit nur in einer WHERE-Klausel unterstützt.
Korrelierte EXISTS-Unterabfragen können einem OR-Operator nicht als Argument angezeigt werden.
Nicht korrelierte EXISTS-Unterabfragen werden überall dort unterstützt, wo ein boolescher Ausdruck zulässig ist.
Beispiele¶
Verwenden Sie eine korrelierte NOT EXISTS-Unterabfrage, um Abteilungen zu ermitteln, die keine Mitarbeiter haben:
SELECT department_id FROM departments d WHERE NOT EXISTS (SELECT 1 FROM employees e WHERE e.department_id = d.department_id);
[ NOT ] IN¶
Die Operatoren IN und NOT IN prüfen, ob ein Ausdruck in den Werten enthalten ist, die von einer Unterabfrage zurückgegeben werden.
Syntax¶
<expr> [ NOT ] IN ( <query> )
Nutzungshinweise¶
IN ist eine Abkürzung für
= ANY
und unterliegt den gleichen Einschränkungen wie ANY-Unterabfragen.NOT IN ist eine Abkürzung für
!= ALL
und unterliegt den gleichen Einschränkungen wie ALL-Unterabfragen.[NOT] IN
kann auch als Operator in Ausdrücken verwendet werden, die keine Unterabfrage enthalten. Weitere Details dazu finden Sie unter [ NOT ] IN.
Beispiele¶
Verwenden Sie eine NOT IN-Unterabfrage, die dem Beispiel für die != ALL
-Unterabfrage entspricht (zuvor unter diesem Thema):
SELECT department_id FROM departments d WHERE d.department_id NOT IN (SELECT e.department_id FROM employees e);