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;
      

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             |
+----------------+