Megosztás a következőn keresztül:


Operátorok beállítása – UNION (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példányAzure Synapse AnalyticsElemzési platformrendszer (PDW)SQL Analytics-végpont a Microsoft FabricbenRaktár a Microsoft FabricbenSQL-adatbázis a Microsoft Fabricben

Két lekérdezés eredményeit egyetlen eredményhalmazba fűzi össze. Beállíthatja, hogy az eredményhalmaz ismétlődő sorokat tartalmaz-e:

  • UNION ALL – Duplikált elemeket tartalmaz.
  • UNION – Kizárja a duplikált elemeket.

A UNION művelet eltér a JOIN művelettől:

  • A UNION két lekérdezés eredményhalmazait fűzi össze. Az UNIÓ azonban nem hoz létre különálló sorokat két táblából összegyűjtött oszlopokból.
  • A JOIN két tábla oszlopait hasonlítja össze, és két tábla oszlopaiból álló eredménysorokat hoz létre.

Az alábbi alapvető szabályok két lekérdezés eredményhalmazainak az UNION használatával történő kombinálására vonatkoznak:

  • Az oszlopok számának és sorrendjének minden lekérdezésben azonosnak kell lennie.

  • Az adattípusoknak kompatibilisnek kell lenniük.

Transact-SQL szintaxis konvenciók

Syntax

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

Arguments

< > query_specification | ( <query_expression> ) Olyan lekérdezési specifikáció vagy lekérdezési kifejezés, amely egy másik lekérdezési specifikációból vagy lekérdezési kifejezésből származó adatokkal kombinálandó adatokat ad vissza. Az union művelet részét képező oszlopok definícióinak nem kell megegyezniük, de implicit átalakítással kompatibilisnek kell lenniük. Ha az adattípusok eltérnek, az eredményként kapott adattípus az adattípus-elsőbbség szabályai alapján lesz meghatározva. Ha a típusok azonosak, de pontosságukban, skálázásukban vagy hosszukban eltérnek, az eredmény a kifejezések kombinálására vonatkozó szabályokon alapul. További információ: Pontosság, skálázás és hossz (Transact-SQL).

Az XML-adattípus oszlopainak egyenlőnek kell lenniük. Az összes oszlopot XML-sémába kell írni, vagy be kell írni. Ha be van állítva, azokat ugyanahhoz az XML-sémagyűjteményhez kell beírni.

UNION
Azt adja meg, hogy több eredményhalmazt kell egyesíteni, és egyetlen eredményhalmazként kell visszaadni.

ALL
Az összes sort belefoglalja az eredményekbe, beleértve az ismétlődéseket is. Ha nincs megadva, a rendszer eltávolítja az ismétlődő sorokat.

Examples

A. Egyszerű unió használata

Az alábbi példában az eredményhalmaz tartalmazza mind a táblák, mind a ProductModelIDName táblák tartalmát és ProductModelGloves oszlopait.

-- 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. A SELECT INTO használata az UNION használatával

A következő példában a INTO második utasítás záradéka azt határozza meg, hogy a névvel ellátott SELECT tábla a kijelölt oszlopok és ProductResults táblák egyesítésének végső eredményhalmazát ProductModelGloves tartalmazza. A Gloves tábla az első SELECT utasításban jön létre.

-- 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. Két SELECT utasítás egyesítő használata az ORDER BY paranccsal

Az UNION záradékban használt egyes paraméterek sorrendje fontos. Az alábbi példa két UNION utasítás helytelen és helyes használatát SELECT mutatja be, amelyekben egy oszlopot át kell nevezni a kimenetben.

-- 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. Három SELECT utasítás egyesítésének használata az ALL és a zárójelek hatásának megjelenítéséhez

Az alábbi példák három olyan tábla eredményeit kombinálják UNION , amelyek mindegyike ugyanazt az 5 adatsort tartalmazza. Az első példa a duplikált rekordok megjelenítésére használja UNION ALL , és mind a 15 sort visszaadja. A második példa anélkül UNION használja ALL az ismétlődő sorokat a három SELECT utasítás összesített eredményeiből, hogy 5 sort ad vissza.

A harmadik példa az elsővel együtt használjaALL, a zárójelek pedig a nem használt UNIONmásodikatUNION.ALL A másodikat UNION először a rendszer dolgozza fel, mert zárójelben van, és 5 sort ad vissza, mert a ALL beállítás nincs használatban, és az ismétlődések törlődnek. Ez az 5 sor a kulcsszavak használatával SELECT az első UNION ALL eredményével van kombinálva. Ez a példa nem távolítja el az ismétlődéseket az öt sorból álló két csoport között. A végeredmény 10 sorból áll.

-- 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éldák: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Egyszerű unió használata

Az alábbi példában az eredményhalmaz a táblák és CustomerKey a FactInternetSales táblák oszlopainak tartalmát tartalmazzaDimCustomer. Mivel az ALL kulcsszó nincs használatban, a rendszer kizárja az ismétlődéseket az eredményekből.

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

F. Két SELECT utasítás egyesítő használata az ORDER BY paranccsal

Ha egy UNION utasításban található SELECT utasítás tartalmaz egy ORDER BY záradékot, ezt a záradékot az összes SELECT utasítás után kell elhelyezni. Az alábbi példa két UNION utasítás helytelen és helyes használatát SELECT mutatja be, amelyekben egy oszlop sorrendje 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. Két SELECT utasítás egyesítő használata a WHERE és AZ ORDER BY paranccsal

Az alábbi példa két UNION utasítás helytelen és helyes használatát SELECT mutatja be, ahol a WHERE és AZ ORDER BY függvényre van szükség.

-- 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. Három SELECT utasítás egyesítésének használata az ALL és a zárójelek effektusainak megjelenítéséhez

Az alábbi példák UNIONugyanazon tábla eredményeinek kombinálásával szemléltetik az ALL és a zárójelek hatását a használat UNIONsorán.

Az első példa UNION ALL duplikált rekordokat jelenít meg, és háromszor adja vissza a forrástábla minden sorát. A második példa anélkül UNION használja ALL az ismétlődő sorokat a három SELECT utasítás összesített eredményeiből, hogy csak a forrástábla duplikált sorait adja vissza.

A harmadik példa az elsővel és a nem használt másodikat ALL zárójelekkel együtt használja UNIONUNION.ALL A második UNION feldolgozásra kerül először, mert zárójelben van. Csak a tábla nem duplikált sorait adja vissza, mert a ALL beállítás nem használható, és az ismétlődések el lesznek távolítva. Ezeket a sorokat a kulcsszavak használatával SELECT kombináljuk az első UNION ALL eredményével. Ez a példa nem távolítja el az ismétlődéseket a két készlet között.

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

Lásd még:

VÁLASZT (Transact-SQL)
SELECT-példák (Transact-SQL)