Udostępnij za pośrednictwem


Operatory zestawu — UNION (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Punkt końcowy analizy SQL w usłudze Microsoft FabricMagazyn w usłudze Microsoft FabricBaza danych SQL w usłudze Microsoft Fabric (wersja zapoznawcza)

Łączy wyniki dwóch zapytań w jeden zestaw wyników. Określasz, czy zestaw wyników zawiera zduplikowane wiersze:

  • UNION ALL — zawiera duplikaty.
  • UNION — wyklucza duplikaty.

Operacja UNION różni się od operacji JOIN:

  • Unia łączy zestawy wyników z dwóch zapytań. Jednak unia nie tworzy pojedynczych wierszy z kolumn zebranych z dwóch tabel.
  • Funkcja JOIN porównuje kolumny z dwóch tabel, aby utworzyć wiersze wyników składające się z kolumn z dwóch tabel.

Poniżej przedstawiono podstawowe reguły łączenia zestawów wyników dwóch zapytań przy użyciu funkcji UNION:

  • Liczba i kolejność kolumn muszą być takie same we wszystkich zapytaniach.

  • Typy danych muszą być zgodne.

Transact-SQL konwencje składni

Syntax

{ <query_specification> | ( <query_expression> ) }   
{ UNION [ ALL ]   
  { <query_specification> | ( <query_expression> ) } 
  [ ...n ] }

Arguments

< > query_specification | ( <query_expression> ) To specyfikacja zapytania lub wyrażenie zapytania, które zwraca dane do połączenia z danymi z innej specyfikacji zapytania lub wyrażenia zapytania. Definicje kolumn, które są częścią operacji UNION, nie muszą być takie same, ale muszą być zgodne z niejawną konwersją. Gdy typy danych różnią się, wynikowy typ danych jest określany na podstawie reguł pierwszeństwa typu danych. Gdy typy są takie same, ale różnią się dokładnością, skalą lub długością, wynik jest oparty na tych samych regułach łączenia wyrażeń. Aby uzyskać więcej informacji, zobacz Precyzja, Skalowanie i Długość (Transact-SQL).

Kolumny typu danych XML muszą być równe. Wszystkie kolumny muszą być wpisywane do schematu XML lub nietypowe. W przypadku wpisywania muszą one być wpisywane do tej samej kolekcji schematów XML.

UNION
Określa, że wiele zestawów wyników ma być połączonych i zwracanych jako pojedynczy zestaw wyników.

ALL
Dołącza wszystkie wiersze do wyników, w tym duplikaty. Jeśli nie zostanie określony, zduplikowane wiersze zostaną usunięte.

Examples

A. Korzystanie z prostej unii

W poniższym przykładzie zestaw wyników zawiera zawartość ProductModelID kolumn i tabel ProductModel i NameGloves .

-- 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. Używanie funkcji SELECT INTO z UNIĄ

W poniższym przykładzie klauzula INTO w drugiej SELECT instrukcji określa, że tabela o nazwie ProductResults zawiera końcowy zestaw wyników unii wybranych kolumn ProductModel tabel i Gloves . Tabela jest tworzona Gloves w pierwszej SELECT instrukcji.

-- 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. Używanie instrukcji UNION dwóch instrukcji SELECT z instrukcjami ORDER BY

Kolejność niektórych parametrów używanych w klauzuli UNION jest ważna. W poniższym przykładzie pokazano niepoprawne i poprawne użycie UNION w dwóch SELECT instrukcjach, w których nazwa kolumny ma zostać zmieniona w danych wyjściowych.

-- 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. Używanie instrukcji UNION z trzech instrukcji SELECT w celu pokazania efektów funkcji ALL i nawiasów

W poniższych przykładach użyto UNION metody , aby połączyć wyniki trzech tabel, które mają te same 5 wierszy danych. W pierwszym przykładzie użyto UNION ALL polecenia , aby wyświetlić zduplikowane rekordy i zwraca wszystkie 15 wierszy. W drugim przykładzie użyto UNION polecenia bez ALL , aby wyeliminować zduplikowane wiersze z połączonych wyników trzech SELECT instrukcji i zwraca 5 wierszy.

W trzecim przykładzie użyto ALL elementu z pierwszym UNION i nawiasami ujętą w drugą UNION , która nie używa elementu ALL. Drugi UNION jest przetwarzany jako pierwszy, ponieważ znajduje się w nawiasach i zwraca 5 wierszy, ponieważ ALL opcja nie jest używana, a duplikaty są usuwane. Te 5 wierszy są łączone z wynikami pierwszego SELECT przy użyciu UNION ALL słów kluczowych. W tym przykładzie nie są usuwane duplikaty między dwoma zestawami pięciu wierszy. Wynik końcowy zawiera 10 wierszy.

-- 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  
  

Przykłady: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Korzystanie z prostej unii

W poniższym przykładzie zestaw wyników zawiera zawartość CustomerKey kolumn tabel FactInternetSales i DimCustomer . Ponieważ słowo kluczowe ALL nie jest używane, duplikaty są wykluczone z wyników.

-- Uses AdventureWorks  
  
SELECT CustomerKey   
FROM FactInternetSales    
UNION   
SELECT CustomerKey   
FROM DimCustomer   
ORDER BY CustomerKey;  

F. Używanie instrukcji UNION dwóch instrukcji SELECT z instrukcjami ORDER BY

Jeśli dowolna instrukcja SELECT w instrukcji UNION zawiera klauzulę ORDER BY, ta klauzula powinna zostać umieszczona po wszystkich instrukcjach SELECT. W poniższym przykładzie pokazano niepoprawne i poprawne użycie UNION w dwóch SELECT instrukcjach, w których kolumna jest uporządkowana za pomocą funkcji 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. Używanie instrukcji UNION dwóch instrukcji SELECT z instrukcjami WHERE i ORDER BY

W poniższym przykładzie pokazano niepoprawne i poprawne użycie UNION w dwóch SELECT instrukcjach, w których potrzebne są instrukcje WHERE i 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. Używanie instrukcji UNION z trzech instrukcji SELECT w celu pokazania efektów wszystkich i nawiasów

W poniższych przykładach użyto UNION metody , aby połączyć wyniki tej samej tabeli w celu zademonstrowania efektów funkcji ALL i nawiasów podczas korzystania z elementu UNION.

W pierwszym przykładzie użyto UNION ALL polecenia , aby wyświetlić zduplikowane rekordy i zwrócić każdy wiersz w tabeli źródłowej trzy razy. W drugim przykładzie użyto UNION polecenia bez ALL , aby wyeliminować zduplikowane wiersze z połączonych wyników trzech SELECT instrukcji i zwracać tylko niezduplikowane wiersze z tabeli źródłowej.

W trzecim przykładzie użyto ALL pierwszego UNION i nawiasu otaczającego drugą UNION , która nie używa elementu ALL. Drugi UNION jest przetwarzany jako pierwszy, ponieważ znajduje się w nawiasach. Zwraca tylko niezreplikowane wiersze z tabeli, ponieważ ALL opcja nie jest używana, a duplikaty są usuwane. Te wiersze są łączone z wynikami pierwszego SELECT przy użyciu UNION ALL słów kluczowych. W tym przykładzie nie są usuwane duplikaty między dwoma zestawami.

-- 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  
);  

See Also

SELECT (Transact-SQL)
PRZYKŁADY SELECT (Transact-SQL)