
UNION et UNION ALL combinent les résultats de deux requêtes, mais avec une différence clé : UNION supprime les doublons (et trie), tandis que UNION ALL garde toutes les lignes — ce qui le rend bien plus rapide. Voici quand utiliser chacun, avec des exemples Oracle.
La différence en une phrase
- UNION = fusion sans doublons (Oracle élimine les lignes identiques → coût de tri/déduplication).
- UNION ALL = fusion brute (toutes les lignes, doublons compris → pas de tri, plus rapide).
Exemple
-- table CLIENTS_PARIS et CLIENTS_LYON, un client peut être dans les deux
SELECT nom FROM clients_paris
UNION
SELECT nom FROM clients_lyon;
-- → chaque nom une seule fois (doublons éliminés)
SELECT nom FROM clients_paris
UNION ALL
SELECT nom FROM clients_lyon;
-- → tous les noms, y compris ceux présents dans les deux tablesPerformances : UNION ALL gagne (souvent largement)
UNION doit comparer et trier l’ensemble du résultat pour retirer les doublons — coûteux sur de gros volumes. UNION ALL se contente d’empiler les lignes. Si vous savez qu’il n’y a pas de doublons (ou qu’ils ne gênent pas), utilisez toujours UNION ALL.
Les règles à respecter
- Les deux requêtes doivent avoir le même nombre de colonnes.
- Les types doivent être compatibles colonne par colonne (sinon erreurs de conversion type ORA-01722).
- Les noms de colonnes du résultat viennent de la première requête.
- Un seul
ORDER BY, à la toute fin.
SELECT nom, ville FROM clients_paris
UNION ALL
SELECT nom, ville FROM clients_lyon
ORDER BY nom;UNION vs JOIN : ne pas confondre
UNION empile des lignes verticalement (deux requêtes, mêmes colonnes). Une jointure combine des tables horizontalement (ajoute des colonnes). Ce sont deux opérations différentes.
INTERSECT et MINUS, les cousins
-- clients présents dans les DEUX
SELECT nom FROM clients_paris INTERSECT SELECT nom FROM clients_lyon;
-- clients de Paris mais PAS de Lyon
SELECT nom FROM clients_paris MINUS SELECT nom FROM clients_lyon;Quand choisir UNION plutôt que UNION ALL ?
- Vous voulez explicitement une liste dédupliquée et le volume reste raisonnable → UNION.
- Performance prioritaire, ou pas de doublons attendus → UNION ALL.
FAQ
UNION trie-t-il les résultats ?
Pour éliminer les doublons, Oracle effectue un tri/hachage interne — le résultat peut paraître trié, mais ne vous y fiez pas : ajoutez un ORDER BY explicite si l’ordre compte.
UNION ALL est-il toujours plus rapide ?
Oui, car il évite l’étape de déduplication. La seule raison de préférer UNION est le besoin réel de supprimer les doublons.
Peut-on mélanger des colonnes de types différents ?
Non : chaque colonne doit être de type compatible entre les deux requêtes. Convertissez explicitement (TO_CHAR, TO_NUMBER) si besoin.
