セット演算子 - UNION (Transact-SQL)
Applies to: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW) Microsoft Fabric の SQL 分析エンドポイント Microsoft Fabric のウェアハウス
2 つのクエリの結果を、単一の結果セットに連結します。 結果セットに重複する行が含まれるかどうかを制御します。
- UNION ALL - 重複が含まれます。
- UNION - 重複が除外されます。
UNION 操作は JOIN とは異なります。
- UNION では、2 つのクエリからの結果セットが連結されます。 ただし、UNION では、2 つのテーブルから収集された列から個々の行が作成されるわけではありません。
- JOIN では、2 つのテーブルの列を比較して、2 つのテーブルの列で構成される結果行を作成します。
UNION を使用して 2 つのクエリの結果セットを結合するための基本的な規則を以下に示します。
列の数と順番は、すべてのクエリで同じであること
データ型に互換性があること
構文
{ <query_specification> | ( <query_expression> ) }
{ UNION [ ALL ]
{ <query_specification> | ( <query_expression> ) }
[ ...n ] }
引数
<query_specification> | ( <query_expression> ) は、別のクエリの仕様やクエリ式からのデータと結合されたデータを返すクエリの仕様またはクエリ式です。 UNION 操作の一部である列の定義は同じである必要はありませんが、暗黙的な変換により一致させる必要があります。 データ型が異なるとき、最終的なデータ型はデータ型の優先順位ルールに基づいて決定されます。 型は同じだが、有効桁数、小数点以下桁数、または長さが異なる場合、結果は式の結合と同じルールに基づいて決定されます。 詳しくは、「有効桁数、小数点以下桁数、および長さ (Transact-SQL)」をご覧ください。
xml データ型の列は同じである必要があります。 すべての列が XML スキーマに型指定されているか、型指定されていない必要があります。 型指定されている場合は、同じ XML スキーマ コレクションに従って型指定されている必要があります。
UNION
複数の結果セットを結合し、1 つの結果セットとして返すことを指定します。
ALL
重複も含めて、すべての行が結果セットに組み込まれます。 指定しない場合、重複する行は削除されます。
例
A. 単純な UNION を使用する
次の例では、結果セットに ProductModelID
テーブルと Name
テーブルの ProductModel
列と 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. UNION と共に SELECT INTO を使用する
次の例では、2 番目の SELECT
ステートメントの INTO
句で、ProductModel
テーブルと Gloves
テーブルから選択された列の UNION の最終的な結果セットを ProductResults
という名前のテーブルに格納することを指定します。 Gloves
テーブルは、最初の 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. ORDER BY 句を指定した 2 つの SELECT ステートメントで UNION 句を使用する
UNION 句で使用するある種のパラメーターの順序には重要な意味があります。 次の例では、出力時に列名を変更する 2 つの SELECT
ステートメントでの UNION
の誤った使用法と正しい使用法を示しています。
-- 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. 3 つの SELECT ステートメントで UNION を使用して、ALL とかっこの効果を示す
次の例では、UNION
を使用して 3 つのテーブルのクエリ結果を結合します。これらのテーブルはすべて同じ 5 行のデータで構成されます。 最初の例では、UNION ALL
を使用して、重複するレコードも含めて 15 行すべてを返します。 2 番目の例では、ALL
を指定せずに UNION
を使用して、3 つの SELECT
ステートメントの結果を結合したものから重複する行を削除し、5 行を返します。
3 番目の例では、最初の UNION
と共に ALL
を使用し、ALL
を使用していない 2 番目の UNION
をかっこで囲んでいます。 2 番目の UNION
はかっこで囲まれているので、最初に処理されます。また、ALL
オプションが使用されず、重複が削除されるため、5 行が返されます。 これらの 5 行は、UNION ALL
キーワードを使用して最初の SELECT
の結果と結合されます。 この例では、5 行で構成される 2 つのセットの重複は削除されません。 最終的な結果は 10 行になります。
-- 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
例: Azure Synapse Analytics、Analytics Platform System (PDW)
E. 単純な UNION を使用する
次の例では、結果セットに FactInternetSales
テーブルと DimCustomer
テーブルの CustomerKey
列の内容が含まれています。 ALL キーワードが使用されていないため、重複が結果から除外されます。
-- Uses AdventureWorks
SELECT CustomerKey
FROM FactInternetSales
UNION
SELECT CustomerKey
FROM DimCustomer
ORDER BY CustomerKey;
F. ORDER BY 句を指定した 2 つの SELECT ステートメントで UNION 句を使用する
UNION ステートメント内の SELECT ステートメントに ORDER BY 句が含まれるとき、その句はすべての SELECT ステートメントの後に置いてください。 次の例では、列を ORDER BY で並べ替える 2 つの UNION
ステートメントでの SELECT
の誤った使用法と正しい使用法を示しています。
-- 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. WHERE 句と ORDER BY 句を指定した 2 つの SELECT ステートメントで UNION 句を使用する
次の例では、WHERE と ORDER BY を必要とする 2 つの UNION
ステートメントでの SELECT
の誤った使用法と正しい使用法を示しています。
-- 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. 3 つの SELECT ステートメントで UNION を使用して、ALL とかっこの効果を示す
次の例では、UNION
利用時の ALL とかっこの効果を示す目的で、UNION
を使用して同じテーブルの結果を結合しています。
最初の例では UNION ALL
を使用し、重複レコードを表示し、ソース テーブルの各行を 3 回返しています。 2 番目の例では、ALL
を指定せずに UNION
を使用して、3 つの SELECT
ステートメントの結果を結合したものから重複する行を削除し、ソース テーブルから重複しない行のみ返します。
3 番目の例では、最初の UNION
と共に ALL
を使用し、ALL
を使用していない 2 番目の UNION
をかっこで囲んでいます。 2 番目の UNION
はかっこで囲まれているために最初に処理されます。 ALL
オプションが使用されず、重複は削除されるため、重複なしの行のみがテーブルから返されます。 これらの行は、SELECT
キーワードを使用して最初の UNION ALL
の結果と結合されます。 この例では、2 つのセットの重複は削除されません。
-- 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
);