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.

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);