Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
UNION, INTERSECT ed EXCEPT
Argomenti
Gli operatori di definizione UNION, INTERSECT ed EXCEPT vengono utilizzati per confrontare e unire i risultati di due espressioni di query separate. Ad esempio, se vuoi sapere quali utenti di un sito web sono sia acquirenti che venditori ma i loro nomi utente sono memorizzati in colonne o tabelle separate, puoi trovare l'intersezione di questi due tipi di utenti. Se vuoi sapere quali utenti del sito sono acquirenti ma non venditori, puoi utilizzare l'operatore EXCEPT per trovare la difference tra i due elenchi di utenti. Se vuoi creare l'elenco di tutti gli utenti, indipendentemente dal ruolo, puoi utilizzare l'operatore UNION.
Sintassi
query { UNION [ ALL ] | INTERSECT | EXCEPT | MINUS } query
Parametri
- query
-
Espressione di query che corrisponde, sotto forma di elenco di selezione, a una seconda espressione di query che segue l'operatore UNION, INTERSECT o EXCEPT. Le due espressioni devono contenere lo stesso numero di colonne di output con tipi di dati compatibili; in caso contrario, i due set di risultati non possono essere confrontati e uniti. Le operazioni di definizione non consentono la conversione implicita tra diverse categorie di tipi di dati. Per ulteriori informazioni, consultare Conversione e compatibilità dei tipi.
Puoi creare query contenenti un numero illimitato di espressioni di query e collegarle agli operatori UNION, INTERSECT ed EXCEPT in qualsiasi combinazione. Ad esempio, la seguente struttura di query è valida, assumendo che le tabelle T1, T2 e T3 contengano set di colonne compatibili:
select * from t1 union select * from t2 except select * from t3 order by c1;
- UNION
-
Operazione di definizione che restituisce le righe da due espressioni di query, indipendentemente dal fatto che le righe derivino da una o entrambe le espressioni.
- INTERSECT
-
Operazione di definizione che restituisce le righe che derivano da due espressioni di query. Le righe che non vengono restituite da entrambe le espressioni vengono scartate.
- EXCEPT | MINUS
-
Operazione di definizione che restituisce le righe che derivano da una delle due espressioni di query. Per qualificarsi per il risultato, le righe devono esistere nella prima tabella dei risultati ma non nella seconda. MINUS ed EXCEPT sono sinonimi esatti.
- ALL
-
La parola chiave ALL conserva tutte le righe duplicate prodotte da UNION. Il comportamento predefinito quando la parola chiave ALL non viene utilizzata è di scartare questi duplicati. INTERSECT ALL, EXCEPT ALL e MINUS ALL non sono supportati.
Ordine di valutazione degli operatori di definizione
Gli operatori di definizione UNION ed EXCEPT sono associativi a sinistra. Se non si specificano le parentesi per influenzare l'ordine di precedenza, una combinazione di questi operatori di definizione viene valutata da sinistra a destra. Ad esempio, nella seguente query, l'operazione UNION di T1 e T2 viene valutata per prima, quindi l'operazione EXCEPT viene eseguita sul risultato di UNION:
select * from t1 union select * from t2 except select * from t3 order by c1;
L'operatore INTERSECT ha la precedenza sugli operatori UNION ed EXCEPT quando una combinazione di operatori viene utilizzata nella stessa query. Ad esempio, la seguente query valuta l'intersezione di T2 e T3, quindi l'unione del risultato con T1:
select * from t1 union select * from t2 intersect select * from t3 order by c1;
Aggiungendo le parentesi, puoi applicare un diverso ordine di valutazione. Nel seguente caso, il risultato dell'unione di T1 e T2 viene intersecato con T3 e la query produce probabilmente un risultato diverso.
(select * from t1 union select * from t2) intersect (select * from t3) order by c1;
Note per l'utilizzo
-
I nomi di colonna restituiti nel risultato di una query dell'operazione di definizione sono i nomi di colonna (o alias) delle tabelle nella prima espressione di query. Poiché questi nomi di colonne sono potenzialmente fuorvianti, in quanto i valori della colonna derivano da tabelle su entrambi i lati dell'operatore di definizione, puoi fornire alias significativi per il set di risultati.
-
Un'espressione di query che precede un operatore di definizione non deve contenere una clausola ORDER BY. Una clausola ORDER BY produce risultati ordinati significativi solo quando viene utilizzata alla fine di una query che contiene operatori di definizione. In questo caso, la clausola ORDER BY si applica ai risultati finali di tutte le operazioni di definizione. La query più esterna può contenere anche clausole LIMIT e OFFSET standard.
-
Quando le query dell'operatore di definizione restituiscono risultati decimali, le colonne dei risultati corrispondenti vengono elevate per restituire la stessa precisione e scala. Ad esempio, nella seguente query, dove T1.REVENUE è una colonna DECIMAL (10,2) e T2.REVENUE è una colonna DECIMAL (8,4), il risultato decimale viene elevato a DECIMAL (12,4):
select t1.revenue union select t2.revenue;
La scala è
4
perché è la scala massima delle due colonne. La precisione è12
perché T1.REVENUE richiede 8 cifre a sinistra del punto decimale (12 - 4 = 8). Questo tipo di elevazione garantisce che tutti i valori di entrambi i lati dell'UNION si adattino al risultato. Per i valori a 64 bit, la precisione massima del risultato è 19 e la scala del risultato massimo è 18. Per i valori a 128 bit, la precisione massima del risultato è 38 e la scala del risultato massimo è 37.Se il tipo di dati risultante supera limiti di precisione e scala di Amazon Redshift, la query restituisce un errore.
-
Per le operazioni di definizione, due righe vengono considerate identiche se, per ciascuna coppia di colonne corrispondente, i due valori di dati sono uguali o entrambi NULL. Ad esempio, se le tabelle T1 e T2 contengono entrambe una colonna e una riga e tale riga è NULL in entrambe le tabelle, un'operazione INTERSECT su quelle tabelle restituisce tale riga.