SQL
UNION / UNION ALL
Recherche…
Introduction
Syntaxe
- SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE condition]
UNION | UNION ALL
SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE condition]
Remarques
UNION
clauses UNION
et UNION ALL
combinent l'ensemble de résultats de deux instructions SELECT structurées de manière identique en un seul résultat.
Le nombre de colonnes et les types de colonne pour chaque requête doivent correspondre pour qu'un UNION
/ UNION ALL
fonctionne.
La différence entre une requête UNION
et une requête UNION ALL
est que la clause UNION
supprime toutes les lignes en double dans le résultat, contrairement à la clause UNION ALL
.
Cette suppression distincte des enregistrements peut considérablement ralentir les requêtes, même si aucune ligne distincte ne doit être supprimée. Par conséquent, si vous savez qu'il n'y aura pas de doublons (ou ne vous inquiétez pas), UNION ALL
toujours optimisée.
Requête de base UNION ALL
CREATE TABLE HR_EMPLOYEES
(
PersonID int,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
CREATE TABLE FINANCE_EMPLOYEES
(
PersonID INT,
LastName VARCHAR(30),
FirstName VARCHAR(30),
Position VARCHAR(30)
);
Disons que nous voulons extraire les noms de tous les managers
de nos départements.
En utilisant un UNION
nous pouvons obtenir tous les employés des départements des ressources humaines et des finances, qui occupent le position
de manager
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
L'instruction UNION
supprime les lignes dupliquées des résultats de la requête. Comme il est possible d'avoir des personnes ayant le même nom et la même position dans les deux départements, nous utilisons UNION ALL
afin de ne pas supprimer les doublons.
Si vous souhaitez utiliser un alias pour chaque colonne de sortie, vous pouvez simplement les placer dans la première instruction select, comme suit:
SELECT
FirstName as 'First Name', LastName as 'Last Name'
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
Explication simple et exemple
En termes simples:
-
UNION
joint 2 jeux de résultats tout en supprimant les doublons du jeu de résultats -
UNION ALL
joint 2 jeux de résultats sans tenter de supprimer les doublons
Une erreur commise par de nombreuses personnes consiste à utiliser un
UNION
sans avoir à supprimer les doublons. Le coût de performance supplémentaire par rapport aux ensembles de résultats importants peut être très important.
Quand vous avez besoin d' UNION
Supposons que vous deviez filtrer une table avec 2 attributs différents et que vous ayez créé des index non clusterisés distincts pour chaque colonne. Un UNION
vous permet de tirer parti des deux index tout en empêchant les doublons.
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
Cela simplifie le réglage des performances car seuls des index simples sont nécessaires pour effectuer ces requêtes de manière optimale. Vous pourriez même être en mesure de vous débrouiller avec beaucoup moins d’index non clusterisés améliorant également les performances d’écriture globales par rapport à la table source.
Quand vous pourriez avoir besoin de UNION ALL
Supposons que vous ayez toujours besoin de filtrer une table avec 2 attributs, mais que vous n'avez pas besoin de filtrer les enregistrements en double (soit parce que vos données ne produiraient aucun doublon au cours de l'union).
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
Cela est particulièrement utile lors de la création de vues qui associent des données conçues pour être partitionnées physiquement sur plusieurs tables (peut-être pour des raisons de performances, mais qui veulent toujours regrouper des enregistrements). Comme les données sont déjà divisées, le fait de supprimer les doublons du moteur de base de données n'ajoute aucune valeur et ajoute simplement du temps de traitement supplémentaire aux requêtes.