Rb Cafe » Postgres » Documentation PostgreSQL 13.10 » Langage SQL » Requêtes » Combiner des requêtes

7.4. Combiner des requêtes

Les résultats de deux requêtes peuvent être combinés en utilisant les opérations d'ensemble : union, intersection et différence. La syntaxe est

requete1 UNION [ALL] requete2
requete1 INTERSECT [ALL] requete2
requete1 EXCEPT [ALL] requete2

requete1 et requete2 sont les requêtes pouvant utiliser toutes les fonctionnalités discutées ici.

UNION ajoute effectivement le résultat de requete2 au résultat de requete1 (bien qu'il n'y ait pas de garantie qu'il s'agisse de l'ordre dans lequel les lignes sont réellement renvoyées). De plus, il élimine les lignes dupliquées du résultat, de la même façon que DISTINCT, sauf si UNION ALL est utilisée.

INTERSECT renvoie toutes les lignes qui sont à la fois dans le résultat de requete1 et dans le résultat de requete2. Les lignes dupliquées sont éliminées sauf si INTERSECT ALL est utilisé.

EXCEPT renvoie toutes les lignes qui sont dans le résultat de requete1 mais pas dans le résultat de requete2 (ceci est quelquefois appelé la différence entre deux requêtes). De nouveau, les lignes dupliquées sont éliminées sauf si EXCEPT ALL est utilisé.

Pour calculer l'union, l'intersection ou la différence de deux requêtes, les deux requêtes doivent être « compatibles pour une union », ce qui signifie qu'elles doivent renvoyer le même nombre de colonnes et que les colonnes correspondantes doivent avoir des types de données compatibles, comme décrit dans la Section 10.5.

Les opérations sur les ensembles peuvent être combinées, par exemple :

requete1 UNION requete2 EXCEPT requete3

qui est équivalent à :

(requete1 UNION requete2) EXCEPT requete3

Comme indiqué ici, vous pouvez utiliser les parenthèses pour contrôler l'ordre d'évaluation. Sans les parenthèses, UNION et EXCEPT font une association de gauche à droite, mais INTERSECT a une priorité plus forte que ces deux opérateurs. De ce fait :

requete1 UNION requete2 INTERSECT requete3

signifie

requete1 UNION (requete2 INTERSECT requete3)

Vous pouvez aussi entourer une requête individuelle avec des parenthèses. C'est important si la requête a besoin d'utiliser une des clauses discutées dans les sections suivantes, telles que LIMIT. Sans les parenthèses, vous obtiendrez soit une erreur de syntaxe soit une interprétation de cette clausse comme s'appliquant à la sortie de l'opération ensembliste plutôt que sur une de ses entrées. Par exemple :

SELECT a FROM b UNION SELECT x FROM y LIMIT 10

est acceptée, mais signifie :

(SELECT a FROM b UNION SELECT x FROM y) LIMIT 10

et non pas :

SELECT a FROM b UNION (SELECT x FROM y LIMIT 10)