Sdílet prostřednictvím


Operátory sady – UNION (Transact-SQL)

Platí pro:SQL ServerAzure SQL DatabaseSpravovaná instance Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Koncový bod analýzy SQL v Microsoft FabricSklad v Microsoft FabricDatabáze SQL v Microsoft Fabric

Zřetězí výsledky dvou dotazů do jedné sady výsledků. Určujete, jestli sada výsledků obsahuje duplicitní řádky:

  • UNION ALL – obsahuje duplicitní položky.
  • UNION – vyloučí duplicity.

Operace UNION se liší od operace JOIN:

  • Union zřetězí sady výsledků ze dvou dotazů. Union ale nevytvoří jednotlivé řádky ze sloupců shromážděných ze dvou tabulek.
  • Funkce JOIN porovnává sloupce ze dvou tabulek a vytváří výsledné řádky složené ze sloupců ze dvou tabulek.

Následují základní pravidla pro kombinování sad výsledků dvou dotazů pomocí funkce UNION:

  • Číslo a pořadí sloupců musí být ve všech dotazech stejné.

  • Datové typy musí být kompatibilní.

Transact-SQL konvence syntaxe

Syntax

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

Arguments

< > query_specification | ( <query_expression> ) Je specifikace dotazu nebo výraz dotazu, který vrací data, která se mají kombinovat s daty z jiné specifikace dotazu nebo výrazu dotazu. Definice sloupců, které jsou součástí operace UNION, nemusí být stejné, ale musí být kompatibilní prostřednictvím implicitního převodu. Pokud se datové typy liší, je výsledný datový typ určen na základě pravidel pro prioritu datového typu. Pokud jsou typy stejné, ale liší se v přesnosti, měřítku nebo délce, výsledek je založený na stejných pravidlech pro kombinování výrazů. Další informace naleznete v tématu Přesnost, Měřítko a Délka (Transact-SQL).

Sloupce datového typu XML se musí shodovat. Všechny sloupce musí být buď zadané do schématu XML, nebo netypované. Pokud jsou zadány, musí být zadány do stejné kolekce schémat XML.

UNION
Určuje, že se má zkombinovat několik sad výsledků a vrátit jako jednu sadu výsledků.

ALL
Začlení všechny řádky do výsledků včetně duplicit. Pokud není zadáno, odeberou se duplicitní řádky.

Examples

A. Použití jednoduché funkce UNION

V následujícím příkladu sada výsledků obsahuje obsah ProductModelID a Name sloupce tabulek ProductModel i Gloves tabulek.

-- 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. Použití příkazu SELECT INTO se sjednocením

V následujícím příkladu INTO klauzule ve druhém SELECT příkazu určuje, že tabulka s názvem ProductResults obsahuje konečnou sadu výsledků sjednocení vybraných sloupců ProductModel a Gloves tabulek. Tabulka Gloves se vytvoří v prvním SELECT příkazu.

-- 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. Použití funkce UNION dvou příkazů SELECT s ORDER BY

Pořadí určitých parametrů použitých s klauzulí UNION je důležité. Následující příklad ukazuje nesprávné a správné použití UNION ve dvou SELECT příkazech, ve kterých má být sloupec přejmenován ve výstupu.

-- 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. Použití funkce UNION ze tří příkazů SELECT k zobrazení účinků ALL a závorek

Následující příklady slouží UNION ke kombinování výsledků tří tabulek, které mají všechny stejné 5 řádků dat. První příklad používá UNION ALL k zobrazení duplicitních záznamů a vrátí všech 15 řádků. Druhý příklad používá UNION bez ALL odstranění duplicitních řádků z kombinovaných výsledků tří SELECT příkazů a vrátí 5 řádků.

Třetí příklad používá ALL první UNION a závorky uzavře druhou UNION , která nepoužívá ALL. Druhá UNION se zpracuje jako první, protože je v závorkách, a vrátí 5 řádků, protože ALL se tato možnost nepoužívá a duplicity se odeberou. Tyto 5 řádků se zkombinují s výsledky prvního SELECT pomocí UNION ALL klíčových slov. Tento příklad neodebere duplicity mezi dvěma sadami pěti řádků. Konečný výsledek má 10 řádků.

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

Příklady: Azure Synapse Analytics a Analytický platformový systém (PDW)

E. Použití jednoduché funkce UNION

V následujícím příkladu sada výsledků obsahuje obsah CustomerKey sloupců obou FactInternetSales tabulek i DimCustomer tabulek. Vzhledem k tomu, že se klíčové slovo ALL nepoužívá, jsou z výsledků vyloučeny duplicity.

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

F. Použití funkce UNION dvou příkazů SELECT s ORDER BY

Pokud jakýkoli příkaz SELECT v příkazu UNION obsahuje klauzuli ORDER BY, měla by být tato klauzule umístěna za všechny příkazy SELECT. Následující příklad ukazuje nesprávné a správné použití UNION ve dvou SELECT příkazech, ve kterých je sloupec seřazen s 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. Použití union dvou příkazů SELECT s WHERE a ORDER BY

Následující příklad ukazuje nesprávné a správné použití UNION ve dvou SELECT příkazech, kde where WHERE a ORDER BY jsou potřeba.

-- 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. Použití funkce UNION tří příkazů SELECT k zobrazení efektů ALL a závorek

Následující příklady slouží UNION ke kombinování výsledků stejné tabulky , aby demonstrovaly účinky ALL a závorky při použití UNION.

První příklad používá UNION ALL k zobrazení duplicitních záznamů a třikrát vrátí každý řádek ve zdrojové tabulce. Druhý příklad používá UNION bez ALL odstranění duplicitních řádků z kombinovaných výsledků tří SELECT příkazů a vrátí pouze nadbytečné řádky ze zdrojové tabulky.

Třetí příklad používá ALL první UNION a závorky ohraničující sekundu UNION , která nepoužívá ALL. Druhá UNION se zpracuje jako první, protože je v závorkách. Vrátí pouze nadbytečné řádky z tabulky, protože ALL možnost se nepoužívá a duplicitní položky se odeberou. Tyto řádky jsou kombinovány s výsledky první SELECT pomocí UNION ALL klíčových slov. Tento příklad neodebere duplicity mezi těmito dvěma sadami.

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

Viz také

SELECT (Transact-SQL)
Příklady SELECT (Transact-SQL)