Operatoren für Unterabfragen¶
Eine Unterabfrage ist eine Abfrage in einer anderen Abfrage. Unterabfrageoperatoren führen Operationen mit den von Unterabfragen erzeugten Werten durch.
Snowflake unterstützt die folgenden Unterabfrageoperatoren:
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 für jeden Wert, den die Unterabfrage zurückgibt, mit dem Operator verglichen:
Wenn ALL angegeben ist, lautet das Ergebnis TRUE, wenn jede Zeile der Unterabfrage die Bedingung erfüllt, andernfalls wird FALSE zurückgegeben.
Wenn ANY angegeben ist, lautet das Ergebnis TRUE, wenn eine 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 nicht als Argument für einen OR-Operator verwendet 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 von einer Unterabfrage erzeugten Werten enthalten ist.
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 der != ALL
-Unterabfrage (weiter oben in diesem Thema) entspricht, um die Abteilungen zu finden, die keine Mitarbeiter haben:
SELECT department_id
FROM departments d
WHERE d.department_id NOT IN (
SELECT e.department_id
FROM employees e);