Operator Set - UNION (Transact-SQL)
Berlaku untuk: Titik akhir analitik SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Platform System (PDW) SQL di Microsoft Fabric Warehouse 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.
Sintaks
{ <query_specification> | ( <query_expression> ) }
{ UNION [ ALL ]
{ <query_specification> | ( <query_expression> ) }
[ ...n ] }
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
);