Operator Set - UNION (Transact-SQL)

Berlaku untuk:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System (PDW)Titik akhir analitik SQL di Microsoft FabricWarehouse di Microsoft Fabric

Menggabungkan hasil dari dua kueri ke dalam satu tataan hasil. Anda mengontrol apakah kumpulan hasil menyertakan baris duplikat:

  • UNION ALL - Termasuk duplikat.
  • UNION - Mengecualikan duplikat.

Operasi UNION berbeda dari JOIN:

  • UNION menggabungkan tataan hasil dari dua kueri. Tetapi UNION tidak membuat baris individual dari kolom yang dikumpulkan dari dua tabel.
  • JOIN membandingkan kolom dari dua tabel, untuk membuat baris hasil yang terdiri dari kolom dari dua tabel.

Berikut ini adalah aturan dasar untuk menggabungkan kumpulan hasil dua kueri dengan menggunakan UNION:

  • Angka dan urutan kolom harus sama dalam semua kueri.

  • Tipe data harus kompatibel.

Konvensi sintaks transact-SQL

Sintaksis

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

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

<> query_specification | ( <query_expression> ) Adalah spesifikasi kueri atau ekspresi kueri yang mengembalikan data untuk digabungkan dengan data dari spesifikasi kueri atau ekspresi kueri lain. Definisi kolom yang merupakan bagian dari operasi UNION tidak harus sama, tetapi harus kompatibel melalui konversi implisit. Ketika jenis data berbeda, jenis data yang dihasilkan ditentukan berdasarkan aturan untuk prioritas jenis data. Ketika jenisnya sama tetapi berbeda dalam presisi, skala, atau panjang, hasilnya didasarkan pada aturan yang sama untuk menggabungkan ekspresi. Untuk informasi selengkapnya, lihat Presisi, Skala, dan Panjang (Transact-SQL).

Kolom tipe data xml harus sama. Semua kolom harus diketik ke skema XML atau tidak diketik. Jika diketik, mereka harus diketik ke koleksi skema XML yang sama.

GABUNGAN
Menentukan bahwa beberapa kumpulan hasil akan digabungkan dan dikembalikan sebagai satu tataan hasil.

SEMUA
Menggabungkan semua baris ke dalam hasil, termasuk duplikat. Jika tidak ditentukan, baris duplikat akan dihapus.

Contoh

J. Menggunakan UNION sederhana

Dalam contoh berikut, kumpulan hasil menyertakan konten ProductModelID kolom dan Name tabel ProductModel dan 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. Menggunakan SELECT INTO dengan UNION

Dalam contoh berikut, INTO klausa dalam pernyataan kedua SELECT menentukan bahwa tabel bernama ProductResults menyimpan kumpulan hasil akhir dari penyatuan kolom yang dipilih dari ProductModel tabel dan Gloves . Tabel Gloves dibuat dalam pernyataan pertama 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. Menggunakan UNION dari dua pernyataan SELECT dengan ORDER BY

Urutan parameter tertentu yang digunakan dengan klausul UNION penting. Contoh berikut menunjukkan penggunaan UNION yang salah dan benar dalam dua SELECT pernyataan di mana kolom akan diganti namanya dalam 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. Menggunakan UNION dari tiga pernyataan SELECT untuk menunjukkan efek ALL dan tanda kurung

Contoh berikut menggunakan UNION untuk menggabungkan hasil tiga tabel yang semuanya memiliki 5 baris data yang sama. Contoh pertama menggunakan UNION ALL untuk menampilkan rekaman duplikat, dan mengembalikan semua 15 baris. Contoh kedua menggunakan UNION tanpa ALL untuk menghilangkan baris duplikat dari hasil gabungan dari tiga SELECT pernyataan, dan mengembalikan 5 baris.

Contoh ketiga menggunakan ALL dengan tanda kurung pertama UNION dan mengapit yang kedua UNION yang tidak menggunakan ALL. Yang kedua UNION diproses terlebih dahulu karena dalam tanda kurung, dan mengembalikan 5 baris karena ALL opsi tidak digunakan dan duplikat dihapus. 5 baris ini dikombinasikan dengan hasil yang pertama SELECT dengan menggunakan UNION ALL kata kunci. Contoh ini tidak menghapus duplikat antara dua set lima baris. Hasil akhir memiliki 10 baris.

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

Contoh: Azure Synapse Analytics and Analytics Platform System (PDW)

E. Menggunakan UNION sederhana

Dalam contoh berikut, kumpulan hasil menyertakan konten CustomerKey kolom tabel FactInternetSales dan DimCustomer . Karena kata kunci ALL tidak digunakan, duplikat dikecualikan dari hasilnya.

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

F. Menggunakan UNION dari dua pernyataan SELECT dengan ORDER BY

Ketika pernyataan SELECT apa pun dalam pernyataan UNION menyertakan klausa ORDER BY, klausa tersebut harus ditempatkan setelah semua pernyataan SELECT. Contoh berikut menunjukkan penggunaan UNION yang salah dan benar dalam dua SELECT pernyataan di mana kolom diurutkan dengan 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. Menggunakan UNION dari dua pernyataan SELECT dengan WHERE dan ORDER BY

Contoh berikut menunjukkan penggunaan UNION yang salah dan benar dalam dua SELECT pernyataan di mana WHERE dan ORDER BY diperlukan.

-- 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. Menggunakan UNION dari tiga pernyataan SELECT untuk memperlihatkan efek ALL dan tanda kurung

Contoh berikut digunakan UNION untuk menggabungkan hasil tabel yang sama untuk menunjukkan efek SEMUA dan tanda kurung saat menggunakan UNION.

Contoh pertama menggunakan UNION ALL untuk menampilkan rekaman duplikat dan mengembalikan setiap baris dalam tabel sumber tiga kali. Contoh kedua menggunakan UNION tanpa ALL menghilangkan baris duplikat dari hasil gabungan dari tiga SELECT pernyataan dan hanya mengembalikan baris yang tidak dinonaktifkan dari tabel sumber.

Contoh ketiga menggunakan ALL dengan tanda kurung pertama UNION dan yang mencakup yang kedua UNION yang tidak menggunakan ALL. Yang kedua UNION diproses terlebih dahulu karena berada dalam tanda kurung. Ini hanya mengembalikan baris yang tidak dinonaktifkan dari tabel karena ALL opsi tidak digunakan dan duplikat dihapus. Baris ini dikombinasikan dengan hasil yang pertama SELECT dengan menggunakan UNION ALL kata kunci. Contoh ini tidak menghapus duplikat di antara dua 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  
);  

Lihat Juga

SELECT (Transact-SQL)
Contoh SELECT (Transact-SQL)