UNION(Transact-SQL)
둘 이상의 쿼리 결과를 각 해당 쿼리에 속하는 모든 행이 포함된 하나의 결과 집합으로 결합합니다. UNION 연산은 두 테이블의 열을 결합하는 조인을 사용하는 것과는 다릅니다.
다음은 UNION을 사용하여 두 쿼리의 결과 집합을 결합하기 위한 기본 규칙입니다.
- 열의 개수와 순서가 모든 쿼리에서 동일해야 합니다.
- 데이터 형식이 호환되어야 합니다.
구문
{ <query_specification> | ( <query_expression> ) }
UNION [ ALL ]
<query_specification | ( <query_expression> )
[ UNION [ ALL ] <query_specification> | ( <query_expression> )
[ ...n ] ]
인수
<query_specification> | ( <query_expression> )
다른 쿼리 사양 또는 쿼리 식의 데이터와 결합할 데이터를 반환하는 쿼리 사양 또는 쿼리 식입니다. UNION 연산의 일부인 열의 정의는 같을 필요는 없지만 암시적 변환을 통해 호환되어야 합니다. 데이터 형식이 다를 때 결과 데이터 형식은 데이터 형식 우선 순위에 따라 결정됩니다. 형식은 동일하지만 전체 자릿수, 소수 자릿수 또는 길이가 다르면 식 결합에 대한 동일한 규칙에 따라 결과가 결정됩니다. 자세한 내용은 전체 자릿수, 소수 자릿수 및 길이(Transact-SQL)를 참조하십시오.xml 데이터 형식의 열은 동등한 형식이어야 합니다. 모든 열은 XML 스키마로 형식화되거나 형식화되지 않아야 합니다. 형식화된 경우 모든 열은 동일한 XML 스키마 컬렉션으로 형식화되어야 합니다.
- UNION
여러 결과 집합을 결합하여 하나의 결과 집합으로 반환하도록 지정합니다.
- ALL
모든 행을 결과로 통합합니다. 여기에는 중복 행이 포함됩니다. 지정하지 않을 경우 중복 행은 제거됩니다.
예
1. 단순 UNION 사용
다음 예에서는 결과 집합에 ProductModel
및 Gloves
테이블의 ProductModelID
및 Name
열의 내용이 포함됩니다.
USE AdventureWorks ;
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
-- Here is the simple union.
USE AdventureWorks ;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name ;
GO
2. UNION과 함께 SELECT INTO 사용
다음 예에서 두 번째 SELECT
문의 INTO
절은 ProductModel
및 Gloves
테이블의 지정된 열에 대해 UNION 연산을 수행한 마지막 결과 집합을 ProductResults
테이블에 포함시키도록 지정합니다. Gloves
테이블은 첫 번째 SELECT
문에서 생성됩니다.
USE AdventureWorks ;
GO
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
USE AdventureWorks ;
GO
SELECT ProductModelID, Name
INTO ProductResults
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves ;
GO
SELECT *
FROM dbo.ProductResults ;
3. 두 SELECT 문에서 ORDER BY와 함께 UNION 사용
UNION 절과 함께 사용되는 특정 매개 변수의 순서는 중요합니다. 다음 예에서는 출력 시 이름이 바뀌는 열이 있는 두 SELECT
문에서 UNION
을 잘못 사용한 경우와 올바르게 사용한 경우를 보여 줍니다.
USE AdventureWorks ;
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
/* INCORRECT */
USE AdventureWorks ;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
ORDER BY Name
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves ;
GO
/* CORRECT */
USE AdventureWorks ;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN (3, 4)
UNION
SELECT ProductModelID, Name
FROM dbo.Gloves
ORDER BY Name ;
GO
4. 3개의 SELECT 문에서 UNION을 사용하여 ALL 및 괄호의 효과 확인
다음 예에서는 UNION
을 사용하여 동일한 5개의 데이터 행이 있는 세 테이블의 결과를 결합합니다. 첫 번째 예에서는 UNION ALL
을 사용하여 중복 레코드를 보여 주고 15개 행을 모두 반환합니다. 두 번째 예에서는 ALL
없이 UNION
을 사용하여 세 SELECT
문의 결합된 결과에서 중복 행을 제거하고 5개 행만 반환합니다.
세 번째 예에서는 첫 번째 UNION
에서 ALL
을 사용하고 ALL
을 사용하지 않는 두 번째 UNION
은 괄호로 묶습니다. 두 번째 UNION
은 괄호로 묶었기 때문에 먼저 처리되고 ALL
옵션을 사용하지 않아 중복 행이 제거되기 때문에 5개 행을 반환합니다. 이러한 5개 행은 UNION ALL
키워드를 사용하여 첫 번째 SELECT
결과와 결합됩니다. 이 때 5개 행으로 된 두 집합 간의 중복 행은 제거되지 않습니다. 따라서 마지막 결과에는 10개의 행이 포함됩니다.
USE AdventureWorks ;
GO
IF OBJECT_ID ('EmployeeOne', 'U') IS NOT NULL
DROP TABLE EmployeeOne ;
GO
IF OBJECT_ID ('EmployeeTwo', 'U') IS NOT NULL
DROP TABLE EmployeeTwo ;
GO
IF OBJECT_ID ('EmployeeThree', 'U') IS NOT NULL
DROP TABLE EmployeeThree ;
GO
SELECT c.LastName, c.FirstName, e.Title
INTO EmployeeOne
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID
WHERE ManagerID = 66 ;
GO
SELECT c.LastName, c.FirstName, e.Title
INTO EmployeeTwo
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID
WHERE ManagerID = 66 ;
GO
SELECT c.LastName, c.FirstName, e.Title
INTO EmployeeThree
FROM Person.Contact c JOIN HumanResources.Employee e
ON e.ContactID = c.ContactID
WHERE ManagerID = 66 ;
GO
-- Union ALL
SELECT LastName, FirstName
FROM EmployeeOne
UNION ALL
SELECT LastName, FirstName
FROM EmployeeTwo
UNION ALL
SELECT LastName, FirstName
FROM EmployeeThree ;
GO
SELECT LastName, FirstName
FROM EmployeeOne
UNION
SELECT LastName, FirstName
FROM EmployeeTwo
UNION
SELECT LastName, FirstName
FROM EmployeeThree ;
GO
SELECT LastName, FirstName
FROM EmployeeOne
UNION ALL
(
SELECT LastName, FirstName
FROM EmployeeTwo
UNION
SELECT LastName, FirstName
FROM EmployeeThree
) ;
GO
참고 항목
참조
SELECT(Transact-SQL)
SELECT 예(Transact-SQL)