Documentation PostgreSQL 9.6.24 > Langage SQL > Requêtes > Combiner des requêtes | |
Listes de sélection | Tri des lignes |
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
où 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, « Constructions UNION, CASE et constructions relatives ».
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)