Recherche…


Introduction

Le mot-clé UNION dans SQL est utilisé pour combiner les résultats de l'instruction SELECT avec aucun duplicata. Pour utiliser UNION et combiner les résultats, les deux instructions SELECT doivent avoir le même nombre de colonnes avec le même type de données dans le même ordre, mais la longueur de la colonne peut être différente.

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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow