SQL
UNIONE / UNIONE TUTTI
Ricerca…
introduzione
Sintassi
- SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE condition]
UNIONE | UNIONE TUTTI
SELECT column_1 [, column_2] FROM table_1 [, table_2] [WHERE condition]
Osservazioni
UNION
clausole UNION
e UNION ALL
combinano il set di risultati di due o più istruzioni SELECT identicamente strutturate in un singolo risultato / tabella.
Sia il numero di colonne che i tipi di colonna per ogni query devono corrispondere affinché UNION
UNION ALL
UNION
/ UNION ALL
funzioni.
La differenza tra una query UNION
e UNION ALL
è che la clausola UNION
rimuoverà qualsiasi riga duplicata nel risultato in cui UNION ALL
non lo farà.
Questa distinta rimozione dei record può rallentare in modo significativo le query anche se non ci sono righe distinte da rimuovere a causa di questo se si sa che non ci saranno duplicati (o non importa) sempre predefinito su UNION ALL
per una query più ottimizzata.
Basic UNION ALL query
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)
);
Diciamo che vogliamo estrarre i nomi di tutti i managers
dai nostri reparti.
Utilizzando UNION
, possiamo ottenere tutti i dipendenti delle risorse umane e finanziarie, che detengono la position
di manager
SELECT
FirstName, LastName
FROM
HR_EMPLOYEES
WHERE
Position = 'manager'
UNION ALL
SELECT
FirstName, LastName
FROM
FINANCE_EMPLOYEES
WHERE
Position = 'manager'
L'istruzione UNION
rimuove le righe duplicate dai risultati della query. Dal momento che è possibile avere persone con lo stesso nome e posizione in entrambi i reparti, stiamo utilizzando UNION ALL
, per non rimuovere i duplicati.
Se si desidera utilizzare un alias per ciascuna colonna di output, è sufficiente inserirli nella prima istruzione select, come segue:
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'
Semplice spiegazione ed esempio
In parole povere:
-
UNION
unisce 2 set di risultati rimuovendo i duplicati dal set di risultati -
UNION ALL
unisce 2 set di risultati senza tentare di rimuovere i duplicati
Un errore che molte persone fanno è usare
UNION
quando non è necessario rimuovere i duplicati. Il costo aggiuntivo delle prestazioni rispetto a set di risultati di grandi dimensioni può essere molto significativo.
Quando potresti aver bisogno di UNION
Supponiamo che sia necessario filtrare una tabella con 2 diversi attributi e che siano stati creati indici separati non in cluster per ogni colonna. UN UNION
ti consente di sfruttare entrambi gli indici evitando al contempo duplicati.
SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2
Questo semplifica l'ottimizzazione delle prestazioni poiché sono necessari solo indici semplici per eseguire queste query in modo ottimale. Si può anche essere in grado di cavarsela con un numero un po 'inferiore di indici non in cluster, migliorando anche le prestazioni di scrittura complessive rispetto alla tabella di origine.
Quando potresti aver bisogno di UNION ALL
Supponiamo che sia necessario filtrare una tabella con 2 attributi, ma non è necessario filtrare i record duplicati (perché non importa o i dati non produrranno duplicati durante l'unione a causa della progettazione del modello di dati).
SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2
Ciò è particolarmente utile durante la creazione di viste che uniscono dati progettati per essere fisicamente partizionati su più tabelle (forse per motivi di prestazioni, ma che comunque desidera registrare i record). Poiché i dati sono già divisi, il fatto che il motore di database rimuova i duplicati non aggiunge alcun valore e aggiunge semplicemente un tempo di elaborazione aggiuntivo alle query.