Opérateurs de sous-requête

Cette rubrique fournit des informations de référence sur les opérateurs de sous-requête pris en charge dans Snowflake. Une sous-requête est une requête dans une autre requête.

Dans ce chapitre :

ALL / ANY

Les mots clés ALL et ANY peuvent être utilisés pour appliquer un opérateur de comparaison aux valeurs produites par une sous-requête (qui peut retourner plus d’une ligne).

Syntaxe

<expr> comparisonOperator { ALL | ANY} ( <query> )

Où :

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

Notes sur l’utilisation

  • L’expression est comparée avec l’opérateur avec chaque valeur retournée par la sous-requête :

    • Si ANY est spécifié, alors le résultat est TRUE si une ligne de la sous-requête satisfait la condition, sinon FALSE est retourné.

    • Si ALL est spécifié, alors le résultat est TRUE si chaque ligne de la sous-requête satisfait la condition, sinon FALSE est retourné.

  • Les sous-requêtes ANY/ALL ne sont actuellement prises en charge que dans une clause WHERE.

  • Les sous-requêtes ANY/ALL ne peuvent pas apparaître comme arguments dans un opérateur OR.

  • La sous-requête ne doit contenir qu’un seul élément dans sa liste SELECT.

Exemples

Utilisez une sous-requête != ALL pour trouver les départements qui n’ont pas d’employés :

SELECT department_id
FROM departments d
WHERE d.department_id != ALL (SELECT e.department_id
                              FROM employees e);

[ NOT ] EXISTS

Une sous-requête EXISTS est une expression booléenne qui peut apparaître dans une clause WHERE ou HAVING, ou dans toute fonction qui fonctionne sur une expression booléenne :

  • Une expression EXISTS s’évalue sur TRUE si des lignes sont produites par la sous-requête.

  • Une expression NOT EXISTS s’évalue sur TRUE si aucune ligne n’est produite par la sous-requête.

Syntaxe

[ NOT ] EXISTS ( <query> )

Notes sur l’utilisation

  • Les sous-requêtes EXISTS corrélées ne sont actuellement prises en charge que dans une clause WHERE.

  • Les sous-requêtes EXISTS corrélées ne peuvent pas apparaître comme arguments dans un opérateur OR.

  • Les sous-requêtes EXISTS non corrélées sont prises en charge partout où une expression booléenne est autorisée.

Exemples

Utilisez une sous-requête corrélée NOT EXISTS pour trouver les départements qui n’ont pas d’employés :

SELECT department_id
FROM departments d
WHERE NOT EXISTS (SELECT 1
                  FROM employees e
                  WHERE e.department_id = d.department_id);

[ NOT ] IN

Les opérateurs IN et NOT IN vérifient si une expression est incluse ou non dans les valeurs renvoyées par une sous-requête.

Syntaxe

<expr> [ NOT ] IN ( <query> )

Notes sur l’utilisation

  • IN est une abréviation pour = ANY, et est sujet aux mêmes restrictions que les sous-requêtes ANY.

  • NOT IN est une abréviation pour != ALL, et est sujet aux mêmes restrictions que les sous-requêtes ALL.

Exemples

Utilisez une sous-requête NOT IN équivalente à l’exemple de sous-requête != ALL (plus haut dans cette rubrique) :

SELECT department_id
FROM departments d
WHERE d.department_id NOT IN (SELECT e.department_id
                              FROM employees e);