Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
UNION, INTERSECT et EXCEPT
Rubriques
Les opérateurs ensemblistes UNION, INTERSECT et EXCEPT sont utilisés pour comparer et fusionner les résultats de deux expressions de requête distinctes. Par exemple, si vous voulez savoir quels utilisateurs d’un site web sont à la fois acheteurs et vendeurs, mais que leurs noms d’utilisateur sont stockés dans des colonnes ou tables distinctes, vous pouvez trouver l’intersection de ces deux types d’utilisateurs. Si vous voulez savoir quels utilisateurs du site web sont acheteurs mais pas vendeurs, vous pouvez utiliser l’opérateur EXCEPT pour trouver la différence entre les deux listes d’utilisateurs. Si vous souhaitez créer une liste de tous les utilisateurs, quel que soit le rôle, vous pouvez utiliser l’opérateur UNION.
Syntaxe
query { UNION [ ALL ] | INTERSECT | EXCEPT | MINUS } query
Paramètres
- query
-
Expression de requête qui correspond, sous la forme de sa liste de sélection, à une deuxième expression de requête qui suit l’opérateur UNION, INTERSECT ou EXCEPT. Les deux expressions doivent comporter le même nombre de colonnes de sortie avec des types de données compatibles ; sinon, les deux jeux de résultats ne peuvent pas être comparés et fusionnés. Les opérations définies n’autorisent pas la conversion implicite entre différentes catégories de types de données ; pour plus d’informations, consultez Compatibilité et conversion de types.
Vous pouvez créer des requêtes qui contiennent un nombre illimité d’expressions de requête et les lier avec les opérateurs UNION, INTERSECT et EXCEPT dans n’importe quelle combinaison. Par exemple, la structure de requête suivante est valide, en supposant que les tables T1, T2 et T3 contiennent des ensembles de colonnes compatibles :
select * from t1 union select * from t2 except select * from t3 order by c1;
- UNION
-
Opération de définition qui renvoie les lignes de deux expressions de requête, indépendamment de savoir si les lignes proviennent de l’une ou des deux expressions.
- INTERSECT
-
Opération de définition qui renvoie les lignes provenant de deux expressions de requête. Les lignes qui ne sont pas retournées par les deux expressions sont ignorées.
- EXCEPT | MINUS
-
Opération de définition qui renvoie les lignes qui dérivent de l’une de deux expressions de requête. Pour être éligible pour le résultat, lignes doivent exister dans la première table de résultats, pas dans la deuxième. MINUS et EXCEPT sont des synonymes exacts.
- ALL
-
Le mot-clé ALL conserve toutes les lignes en double produites par UNION. Le comportement par défaut lorsque le mot-clé ALL n’est pas utilisé consiste à ignorer ces doublons. INTERSECT ALL, EXCEPT ALL et MINUS ALL ne sont pas pris en charge.
Ordre d’évaluation des opérateurs ensemblistes
Les opérateurs ensemblistes UNION et EXCEPT sont associatifs à gauche. Si les parenthèses ne sont pas spécifiées pour influer sur l’ordre de priorité, une combinaison de ces opérateurs ensemblistes est évaluée de gauche à droite. Par exemple, dans la requête suivante, l’UNION de T1 et de T2 est évaluée en premier, puis l’opération EXCEPT est effectuée sur le résultat UNION :
select * from t1 union select * from t2 except select * from t3 order by c1;
L’opérateur INTERSECT est prioritaire sur les opérateurs UNION et EXCEPT quand une combinaison d’opérateurs est utilisée dans la même requête. Par exemple, la requête suivante permet d’évaluer l’intersection de T2 et de T3, puis d’unir le résultat à T1 :
select * from t1 union select * from t2 intersect select * from t3 order by c1;
Par l’ajout de parenthèses, vous pouvez appliquer un ordre d’évaluation différent. Dans le cas suivant, le résultat de l’union de T1 et de T2 est croisé avec T3, et la requête est susceptible de produire un résultat différent.
(select * from t1 union select * from t2) intersect (select * from t3) order by c1;
Notes d’utilisation
-
Les noms de colonne retournés dans le résultat d’une opération ensembliste sont les noms de colonne (ou alias) des tables de la première expression de requête. Comme ces noms de colonne sont potentiellement trompeurs, en ce sens que les valeurs de la colonne proviennent de tables de l’un ou de l’autre côté de l’opérateur ensembliste, il se peut que vous vouliez fournir des alias descriptifs pour le jeu de résultats.
-
Une expression de requête qui précède un opérateur ensembliste ne doit pas contenir une clause ORDER BY. Une clause ORDER BY ne produit des résultats triés significatifs que lorsqu’elle est utilisée à la fin d’une requête contenant des opérateurs ensemblistes. Dans ce cas, la clause ORDER BY s’applique aux résultats finaux de toutes les opérations ensemblistes. La requête la plus externe peut également contenir des clauses LIMIT et OFFSET standard.
-
Lorsque les requêtes avec opérateurs ensemblistes renvoient des résultats décimaux, les colonnes de résultats correspondantes sont promues pour renvoyer les mêmes précision et échelle. Par exemple, dans la requête suivante, où T1.REVENUE est une colonne DECIMAL(10,2) et T2.REVENUE une colonne DECIMAL(8,4), le résultat décimal est promu en DECIMAL(12,4) :
select t1.revenue union select t2.revenue;
L’échelle est
4
, parce que c’est l’échelle maximale des deux colonnes. La précision est12
parce que T1.REVENUE nécessite 8 chiffres à gauche de la virgule (12-4 = 8). Cette promotion de type garantit que toutes les valeurs de chaque côté de l’UNION conviennent au résultat. Pour les valeurs 64 bits, la précision de résultat maximale est de 19 et l’échelle de résultat maximale de 18. Pour les valeurs 128 bits, la précision de résultat maximale est de 38 et l’échelle de résultat maximale de 37.Si le type de données qui en résulte dépasse les limites Amazon Redshift de précision et d’échelle, la requête renvoie une erreur.
-
Pour les opérations ensemblistes, deux lignes sont traitées comme identiques si, pour chaque paire correspondante de colonnes, les deux valeurs de données sont égales ou toutes deux NULL. Par exemple, si les tables T1 et T2 contiennent une colonne et une ligne, et que la ligne a la valeur NULL dans les deux tables, une opération INTERSECT sur ces tables renvoie cette ligne.