Ricerca…


introduzione

La parola chiave UNION in SQL viene utilizzata per combinare i risultati dell'istruzione SELECT con qualsiasi duplicato. Per utilizzare UNION e combinare i risultati, entrambe le istruzioni SELECT devono avere lo stesso numero di colonne con lo stesso tipo di dati nello stesso ordine, ma la lunghezza della colonna può essere diversa.

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.



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow