Opérateurs Set¶
Les opérateurs Set autorisent de combiner les requêtes.
Dans ce chapitre :
Syntaxe générale¶
[ ( ] <query> [ ) ] { INTERSECT | { MINUS | EXCEPT } | UNION [ ALL ] } [ ( ] <query> [ ) ]
[ ORDER BY ... ]
[ LIMIT ... ]
Notes générales sur l’utilisation¶
Chaque requête peut elle-même contenir des opérateurs de requête, ce qui permet de combiner un nombre quelconque d’expressions de requête avec des opérateurs Set.
Les clauses ORDER BY et LIMIT / FETCH sont appliquées au résultat de l’opérateur Set.
Lors de l’utilisation de ces opérateurs :
Assurez-vous que chaque requête sélectionne le même nombre de colonnes.
Lorsque vous utilisez ces opérateurs, assurez-vous que les types de données de chaque colonne sont cohérents d’une ligne à l’autre à partir de sources différentes. L’un des exemples de la section Exemples ci-dessous illustre le problème potentiel et la solution adéquate lorsque les types de données ne correspondent pas.
En général, les « significations », ainsi que les types de données, des colonnes doivent correspondre. Ce qui suit ne produira pas les résultats souhaités :
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName, LastName FROM contractors;
Le risque d’erreur augmente lorsque vous utilisez l’astérisque pour spécifier toutes les colonnes d’un tableau, par exemple :
SELECT * FROM table1 UNION ALL SELECT * FROM table2;
Si les tables ont le même nombre de colonnes, mais que les colonnes ne sont pas dans le même ordre, les résultats de la requête seront probablement incorrects.
Les noms des colonnes de sortie sont basés sur les noms des colonnes de la première requête. Par exemple, la requête suivante :
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName, LastName FROM contractors;
se comporte comme si la requête était :
SELECT LastName, FirstName FROM employees UNION ALL SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
La priorité des opérateurs Set correspond aux normes ANSI et ISO SQL :
Les opérateurs
UNION [ALL]
etMINUS
(EXCEPT
) ont la même priorité.L’opérateur
INTERSECT
a une priorité plus élevée queUNION [ALL]
etMINUS
(EXCEPT
).
Les opérateurs de même priorité sont traités de gauche à droite.
Vous pouvez utiliser des parenthèses pour forcer les expressions à être évaluées dans un ordre différent.
Tous les fournisseurs de bases de données ne suivent pas la norme ANSI/ISO pour la priorité des opérateurs Set. Snowflake recommande d’utiliser des parenthèses pour spécifier l’ordre d’évaluation, en particulier si vous portez du code d’un autre fournisseur vers Snowflake ou si vous écrivez du code que vous pourriez exécuter sur d’autres bases de données ainsi que sur Snowflake.
INTERSECT¶
Retourne les lignes d’un jeu de résultats d’une requête qui apparaissent également dans le jeu de résultats d’une autre requête, avec élimination des doublons.
Syntaxe¶
SELECT ...
INTERSECT
SELECT ...
MINUS , EXCEPT¶
Supprime les lignes du jeu de résultats d’une requête qui apparaissent dans le jeu de résultats d’une autre requête, avec élimination des doublons.
Les mots clés MINUS et EXCEPT ont la même signification et peuvent être utilisés de manière interchangeable.
Syntaxe¶
SELECT ...
MINUS
SELECT ...
SELECT ...
EXCEPT
SELECT ...
UNION [ ALL ]¶
Combine les ensembles de résultats de deux requêtes :
UNION se combine avec l’élimination des doublons.
UNION ALL se combine avec l’élimination des doublons.
La valeur par défaut est UNION (c.-à-d. élimination des doublons).
Syntaxe¶
SELECT ...
UNION [ ALL ]
SELECT ...
Exemples¶
Cet exemple illustre l’utilisation de base de l’opérateur UNION. Il illustre également un problème potentiel lorsque les types de données ne correspondent pas, puis fournit la solution.
Commencez par créer des tables et à insérer des données :
CREATE TABLE t1 (v VARCHAR); CREATE TABLE t2 (i INTEGER); INSERT INTO t1 (v) VALUES ('Adams, Douglas'); INSERT INTO t2 (i) VALUES (42);
Exécutez une opération UNION avec différents types de données :
SELECT v FROM t1 -- VARCHAR UNION SELECT i FROM t2 -- INTEGER ;Sortie :
100038 (22018): Numeric value 'Adams, Douglas' is not recognized
Maintenant, utilisez la conversion explicite pour convertir les entrées en un type compatible :
SELECT v::VARCHAR FROM t1 UNION SELECT i::VARCHAR FROM t2;Sortie :
+----------------+ | V::VARCHAR | |----------------| | Adams, Douglas | | 42 | +----------------+