Utilisation des sous-requêtes¶
Une sous-requête est une requête dans une autre requête. Les sous-requêtes dans une clause FROM ou WHERE sont utilisées pour fournir des données qui seront utilisées pour limiter ou comparer/évaluer les données renvoyées par la requête les contenant.
Dans ce chapitre :
Types de sous-requêtes¶
Sous-requêtes scalaires et non scalaires¶
Les sous-requêtes peuvent aussi être classées comme scalaires ou non scalaires :
Une sous-requête scalaire retourne une valeur unique (une colonne d’une ligne). Si aucune ligne ne peut être retournée, la sous-requête retourne NULL.
Une sous-requête non scalaire renvoie 0, 1 ou plusieurs lignes, chacune pouvant contenir 1 ou plusieurs colonnes. Pour chaque colonne, s’il n’y a pas de valeur à retourner, la sous-requête retourne NULL. Si aucune ligne ne peut être retournée, la sous-requête retourne 0 ligne (pas NULLs).
Types pris en charge par Snowflake¶
Snowflake prend actuellement en charge les types de sous-requêtes suivants :
Opérateurs de sous-requête¶
Les opérateurs de sous-requêtes opèrent sur des expressions de requête imbriquées. Ils peuvent être utilisés pour calculer des valeurs qui sont :
Sous-requêtes scalaires¶
Une sous-requête scalaire est une sous-requête qui retourne au maximum une ligne. Une sous-requête scalaire peut apparaître partout où une expression de valeur peut apparaître, y compris la liste SELECT, la clause GROUP BY, ou comme argument dans une fonction dans une clause WHERE ou HAVING.
Notes sur l’utilisation¶
Une sous-requête scalaire ne peut contenir qu’un seul élément dans la liste SELECT.
Si une sous-requête scalaire renvoie plus d’une ligne, une erreur d’exécution est générée.
Les sous-requêtes scalaires corrélées ne sont actuellement prises en charge que si elles peuvent être déterminées statiquement pour retourner une ligne, (par exemple si la liste SELECT contient une fonction d’agrégation sans fonction GROUP BY).
Les sous-requêtes scalaires non corrélées sont prises en charge partout où une expression de valeur est autorisée.
Les sous-requêtes avec une corrélation à l’intérieur de FLATTEN ne sont actuellement pas prises en charge.
La clause LIMIT / FETCH n’est autorisée que dans les sous-requêtes scalaires non corrélées.
Exemples¶
Cet exemple montre une sous-requête de base non corrélée dans une clause WHERE :
SELECT employee_id FROM employees WHERE salary = (SELECT max(salary) FROM employees);
Cet exemple montre une sous-requête non corrélée dans une clause FROM ; cette sous-requête de base n’obtient qu’un sous-ensemble des informations dans la table international_GDP
. La requête globale liste les emplois dans les pays « à salaire élevé » où le salaire annuel de l’emploi est le même que le GDP par habitant dans ce pays.
SELECT p.name, p.annual_wage, p.country FROM pay AS p INNER JOIN (SELECT name, per_capita_GDP FROM international_GDP WHERE per_capita_GDP >= 10000.0) AS pcg ON pcg.per_capita_GDP = p.annual_wage AND p.country = pcg.name;
Limites¶
Bien que les sous-requêtes puissent contenir un grand nombre d’instructions SELECT, elles présentent les limitations suivantes :
Certaines clauses ne sont pas autorisées dans les sous-requêtes ANY/ALL/NOT EXISTS.
Le seul type de sous-requête qui autorise une clause LIMIT / FETCH est une sous-requête scalaire non corrélée. De plus, puisqu’une sous-requête scalaire non corrélée ne renvoie qu’une seule ligne, la clause LIMIT a peu ou pas de valeur pratique dans une sous-requête.