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 ... ]
Copy

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

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

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

      se comporte comme si la requête était :

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
      
      Copy
  • La priorité des opérateurs Set correspond aux normes ANSI et ISO SQL :

    • Les opérateurs UNION [ALL] et MINUS (EXCEPT) ont la même priorité.

    • L’opérateur INTERSECT a une priorité plus élevée que UNION [ALL] et MINUS (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 ...
Copy

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

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

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

Exécutez une opération UNION avec différents types de données :

SELECT v FROM t1    -- VARCHAR
UNION
SELECT i FROM t2    -- INTEGER
;
Copy

Sortie :

100038 (22018): Numeric value 'Adams, Douglas' is not recognized
Copy

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

Sortie :

+----------------+
| V::VARCHAR     |
|----------------|
| Adams, Douglas |
| 42             |
+----------------+
Copy