Opérateurs de sous-requête

Une sous-requête est une requête dans une autre requête. Les opérateurs de sous-requête effectuent des opérations sur les valeurs générées par les sous-requêtes.

Snowflake prend en charge les opérateurs de sous-requête suivants :

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

Où :

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

Notes sur l’utilisation

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

    • 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é.

    • 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é.

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

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

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

[ NOT ] IN

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

Syntaxe

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

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.

  • [NOT] IN peut également être utilisé comme opérateur dans des expressions qui n’impliquent pas de sous-requête. Pour plus de détails, voir [ NOT ] IN.

Exemples

Utilisez une sous-requête NOT IN équivalente à l’exemple de sous-requête != ALL (plus haut dans cette rubrique) pour trouver les départements qui n’ont pas d’employés :

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