Operatori sui set - UNION (Transact-SQL)
Si applica a: SQL Server
database SQL di Azure
Istanza gestita di SQL di Azure
endpoint di analisi SQL di Azure Synapse Analytics
Platform System (PDW)
in Microsoft Fabric
Warehouse in Microsoft Fabric
Concatena i risultati di due query in un unico set di risultati. È possibile controllare se il set di risultati include righe duplicate:
- UNION ALL: include i duplicati.
- UNION: esclude i duplicati.
Un'operazione UNION è diversa da un JOIN:
- UNION concatena i set di risultati di due query. UNION tuttavia non crea singole righe da colonne raccolte da due tabelle.
- Un JOIN confronta le colonne di due tabelle, per creare righe di risultati costituite dalle colonne di due tabelle.
Di seguito sono riportate le regole di base per la combinazione dei set di risultati di due query tramite l'istruzione UNION:
Tutte le query devono includere lo stesso numero di colonne nello stesso ordine.
I tipi di dati devono essere compatibili.
Convenzioni relative alla sintassi Transact-SQL
Sintassi
{ <query_specification> | ( <query_expression> ) }
{ UNION [ ALL ]
{ <query_specification> | ( <query_expression> ) }
[ ...n ] }
Nota
Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere Documentazione delle versioni precedenti.
Argomenti
<query_specification> | ( <query_expression> ) Specifica o espressione di query che restituisce dati da combinare con i dati di un'altra specifica o espressione di query. Le definizioni delle colonne di un'operazione UNION non devono essere necessariamente identiche, ma devono essere compatibili tramite una conversione implicita. Se i tipi di dati sono diversi, il tipo di dati risultante viene definito in base alle regole valide per la precedenza dei tipi di dati. Quando i tipi sono gli stessi ma differiscono per precisione, scala o lunghezza, il risultato viene determinato in base alle stesse regole previste per la combinazione di espressioni. Per altre informazioni, vedere Precisione, scala e lunghezza (Transact-SQL).
Le colonne con tipo di dati xml devono essere equivalenti. Tutte le colonne devono essere tipizzate in un XML Schema oppure senza tipo. In caso di colonne tipizzate, esse devono essere tipizzate nella stessa raccolta di XML Schema.
UNION
Specifica che più set di risultati devono essere combinati e restituiti come singolo set di risultati.
ALL
Incorpora tutte le righe nei risultati, inclusi i duplicati. Se viene omesso, le righe duplicate vengono rimosse.
Esempi
R. Utilizzo di un semplice operatore UNION
Nell'esempio seguente il set di risultati include il contenuto delle colonne ProductModelID
e Name
di entrambe le tabelle ProductModel
e Gloves
.
-- Uses AdventureWorks
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Here is the simple union.
-- Uses AdventureWorks
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
B. Utilizzo di SELECT INTO con UNION
Nell'esempio seguente la clausola INTO
nella seconda istruzione SELECT
specifica che la tabella denominata ProductResults
contiene il set di risultati finale ottenuto con l'unione delle colonne selezionate delle tabelle ProductModel
e Gloves
. La tabella Gloves
viene creata nella prima istruzione SELECT
.
-- Uses AdventureWorks
IF OBJECT_ID ('dbo.ProductResults', 'U') IS NOT NULL
DROP TABLE dbo.ProductResults;
GO
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
-- Uses AdventureWorks
SELECT ProductModelID, Name
INTO dbo.ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
SELECT ProductModelID, Name
FROM dbo.ProductResults;
C. Utilizzo dell'operatore UNION in due istruzioni SELECT con la clausola ORDER BY
L'ordine di alcuni parametri utilizzati con la clausola UNION è importante. Nell'esempio seguente vengono illustrati l'utilizzo errato e quello corretto di UNION
in due istruzioni SELECT
in cui una colonna deve essere rinominata nell'output.
-- Uses AdventureWorks
IF OBJECT_ID ('dbo.Gloves', 'U') IS NOT NULL
DROP TABLE dbo.Gloves;
GO
-- Create Gloves table.
SELECT ProductModelID, Name
INTO dbo.Gloves
FROM Production.ProductModel
WHERE ProductModelID IN (3, 4);
GO
/* INCORRECT */
-- Uses AdventureWorks
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves;
GO
/* CORRECT */
-- Uses AdventureWorks
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name;
GO
D. Utilizzo dell'operatore UNION in tre istruzioni SELECT per illustrare gli effetti dell'opzione ALL e delle parentesi
Negli esempi seguenti viene utilizzato l'operatore UNION
per combinare i risultati di tre tabelle contenenti 5 righe di dati identiche. Nel primo esempio viene utilizzato UNION ALL
per mostrare i record duplicati e vengono restituite tutte le 15 righe. Nel secondo esempio l'operatore UNION
viene utilizzato senza l'opzione ALL
per eliminare le righe duplicate dai risultati combinati delle tre istruzioni SELECT
e vengono restituite 5 righe.
Il terzo esempio usa ALL
con il primo operatore UNION
e il secondo operatore UNION
, che non usa ALL
, viene racchiuso tra parentesi. Il secondo operatore UNION
viene elaborato per primo in quanto è racchiuso tra parentesi e restituisce cinque righe perché l'opzione ALL
non viene usata e i duplicati vengono rimossi. Queste 5 righe vengono combinate con i risultati della prima istruzione SELECT
mediante le parole chiave UNION ALL
. Questo esempio non rimuove i duplicati tra i due set di cinque righe. Il risultato finale include 10 righe.
-- Uses AdventureWorks
IF OBJECT_ID ('dbo.EmployeeOne', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeOne;
GO
IF OBJECT_ID ('dbo.EmployeeTwo', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeTwo;
GO
IF OBJECT_ID ('dbo.EmployeeThree', 'U') IS NOT NULL
DROP TABLE dbo.EmployeeThree;
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeOne
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeTwo
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
SELECT pp.LastName, pp.FirstName, e.JobTitle
INTO dbo.EmployeeThree
FROM Person.Person AS pp JOIN HumanResources.Employee AS e
ON e.BusinessEntityID = pp.BusinessEntityID
WHERE LastName = 'Johnson';
GO
-- Union ALL
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeOne
UNION ALL
SELECT LastName, FirstName ,JobTitle
FROM dbo.EmployeeTwo
UNION ALL
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree;
GO
SELECT LastName, FirstName,JobTitle
FROM dbo.EmployeeOne
UNION ALL
(
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeTwo
UNION
SELECT LastName, FirstName, JobTitle
FROM dbo.EmployeeThree
);
GO
Esempi: Azure Synapse Analytics e Piattaforma di strumenti analitici (PDW)
E. Utilizzo di un semplice operatore UNION
Nell'esempio seguente il set di risultati include il contenuto delle colonne CustomerKey
di entrambe le tabelle FactInternetSales
e DimCustomer
. Poiché la parola chiave ALL non viene usata, i duplicati vengono esclusi dai risultati.
-- Uses AdventureWorks
SELECT CustomerKey
FROM FactInternetSales
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
F. Utilizzo dell'operatore UNION in due istruzioni SELECT con la clausola ORDER BY
Quando un'istruzione SELECT in un'istruzione UNION include una clausola ORDER BY, tale clausola deve essere inserita dopo tutte le istruzioni SELECT. Nell'esempio seguente vengono illustrati l'uso errato e quello corretto di UNION
in due istruzioni SELECT
in cui una colonna è ordinata con ORDER BY.
-- Uses AdventureWorks
-- INCORRECT
SELECT CustomerKey
FROM FactInternetSales
ORDER BY CustomerKey
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
-- CORRECT
USE AdventureWorksPDW2012;
SELECT CustomerKey
FROM FactInternetSales
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
G. Uso dell'operatore UNION in due istruzioni SELECT con WHERE e ORDER BY
Nell'esempio seguente vengono illustrati l'uso errato e quello corretto di UNION
in due istruzioni SELECT
in cui sono necessarie le clausole WHERE e ORDER BY.
-- Uses AdventureWorks
-- INCORRECT
SELECT CustomerKey
FROM FactInternetSales
WHERE CustomerKey >= 11000
ORDER BY CustomerKey
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
-- CORRECT
USE AdventureWorksPDW2012;
SELECT CustomerKey
FROM FactInternetSales
WHERE CustomerKey >= 11000
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
H. Uso dell'operatore UNION in tre istruzioni SELECT per illustrare gli effetti dell'opzione ALL e delle parentesi
L'esempio seguente usa UNION
per combinare i risultati della stessa tabella per illustrare gli effetti dell'opzione ALL e delle parentesi quando si usa UNION
.
Il primo esempio usa UNION ALL
per visualizzare i record duplicati e restituisce ogni riga nella tabella di origine tre volte. Nel secondo esempio l'operatore UNION
viene usato senza l'opzione ALL
per eliminare le righe duplicate dai risultati combinati delle tre istruzioni SELECT
e vengono restituite solo le righe non duplicate dalla tabella di origine.
Il terzo esempio usa ALL
con il primo operatore UNION
e il secondo operatore UNION
, che non usaALL
, viene racchiuso tra parentesi. Il secondo operatore UNION
viene elaborato per primo perché è racchiuso tra parentesi. Restituisce solo le righe non duplicate della tabella perché l'opzione ALL
non viene usata e i duplicati vengono rimossi. Queste righe vengono combinate con i risultati della prima istruzione SELECT
mediante le parole chiave UNION ALL
. Questo esempio non rimuove i duplicati tra i due set.
-- Uses AdventureWorks
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer
UNION ALL
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer
UNION ALL
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer;
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer
UNION
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer
UNION
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer;
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer
UNION ALL
(
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer
UNION
SELECT CustomerKey, FirstName, LastName
FROM DimCustomer
);
Vedi anche
SELECT (Transact-SQL)
Esempi di istruzioni SELECT (Transact-SQL)