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

Wobei:

comparisonOperator ::=
  { = | != | > | >= | < | <= }
Copy

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

[ 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> )
Copy

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

[ 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> )
Copy

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