Операторы работы с наборами — UNION (Transact-SQL)Set Operators - UNION (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ:даSQL Server (начиная с 2008)даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Объединяет результаты двух или более запросов в один результирующий набор, в который входят все строки, принадлежащие всем запросам в объединении.Combines the results of two or more queries into a single result set that includes all the rows that belong to all queries in the union. Операция UNION отличается от соединений столбцов из двух таблиц.The UNION operation is different from using joins that combine columns from two tables.

Ниже приведены основные правила объединения результирующих наборов двух запросов с помощью операции UNION:The following are basic rules for combining the result sets of two queries by using UNION:

СинтаксисSyntax

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

АргументыArguments

<query_specification> | ( <query_expression> ) Спецификация запроса или выражение запроса, возвращающее данные для объединения с данными из другой спецификации запроса или выражения запроса.<query_specification> | ( <query_expression> ) Is a query specification or query expression that returns data to be combined with the data from another query specification or query expression. Определения столбцов, которые являются частью операции UNION, не должны совпадать, однако должны быть совместимыми посредством неявного преобразования.The definitions of the columns that are part of a UNION operation do not have to be the same, but they must be compatible through implicit conversion. Если типы данных различаются, то получившийся тип данных определяется на основе правил очередности типов данных.When data types differ, the resulting data type is determined based on the rules for data type precedence. Если типы одинаковы, но различаются по точности, масштабу или длине, результат определяется на основе тех же самых правил, которые действуют при объединении выражений.When the types are the same but differ in precision, scale, or length, the result is determined based on the same rules for combining expressions. Дополнительные сведения см. в разделе Точность, масштаб и длина (Transact-SQL).For more information, see Precision, Scale, and Length (Transact-SQL).

Столбцы типа данных xml должны быть эквивалентны друг другу.Columns of the xml data type must be equivalent. Все столбцы должны либо иметь тип, определенный в XML-схеме, либо быть нетипизированными.All columns must be either typed to an XML schema or untyped. Типизированные столбцы должны относиться к одной и той же коллекции XML-схем.If typed, they must be typed to the same XML schema collection.

UNIONUNION
Указывает на то, что несколько результирующих наборов следует объединить и возвратить в виде единого результирующего набора.Specifies that multiple result sets are to be combined and returned as a single result set.

ALLALL
Объединяет в результирующий набор все строки.Incorporates all rows into the results. Это относится и к дублирующимся строкам.This includes duplicates. Если обратное не указано, дубликаты строк удаляются.If not specified, duplicate rows are removed.

ПримерыExamples

A.A. Использование простого UNIONUsing a simple UNION

При выполнении следующего примера в результирующий набор включается содержимое столбцов ProductModelID и Name таблиц ProductModel и Gloves.In the following example, the result set includes the contents of the ProductModelID and Name columns of both the ProductModel and Gloves tables.

-- 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. Использование SELECT INTO с UNIONUsing SELECT INTO with UNION

При выполнении следующего примера предложение INTO во второй инструкции SELECT указывает, что в таблице с именем ProductResults содержится итоговый результирующий набор объединения заданных столбцов таблиц ProductModel и Gloves.In the following example, the INTO clause in the second SELECT statement specifies that the table named ProductResults holds the final result set of the union of the designated columns of the ProductModel and Gloves tables. Заметим, что таблица Gloves была создана в результате выполнения первой инструкции SELECT.Note that the Gloves table is created in the first SELECT statement.

-- 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. Использование UNION двух инструкций SELECT с ORDER BYUsing UNION of two SELECT statements with ORDER BY

При использовании предложения UNION необходимо соблюдать порядок следования определенных параметров.The order of certain parameters used with the UNION clause is important. В следующем примере показаны случаи правильного и неверного использования UNION в двух инструкциях SELECT, в которых необходимо переименовать столбцы на выходе.The following example shows the incorrect and correct use of UNION in two SELECT statements in which a column is to be renamed in the 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. Использование UNION трех инструкций SELECT для демонстрации эффекта от использования скобок и ALLUsing UNION of three SELECT statements to show the effects of ALL and parentheses

В следующих примерах предложение UNION используется для комбинирования результатов из трех таблиц, содержащих по 5 одинаковых строк данных.The following examples use UNION to combine the results of three tables that all have the same 5 rows of data. В первом примере используется предложение UNION ALL, в результате чего выдаются все 15 строк.The first example uses UNION ALL to show the duplicated records, and returns all 15 rows. Во втором примере предложение UNION используется без ключевого слова ALL, что позволяет удалить повторяющиеся строки из комбинированного результата выполнения трех инструкций SELECT и вывести только 5 строк.The second example uses UNION without ALL to eliminate the duplicate rows from the combined results of the three SELECT statements, and returns 5 rows.

В третьем примере с первым предложением ALL используется ключевое слово UNION, а во втором предложении UNION вместо ключевого слова ALL используются скобки.The third example uses ALL with the first UNION and parentheses enclose the second UNION that is not using ALL. Сначала выполняется второе предложение UNION, которое заключено в скобки. В результате возвращаются 5 строк, так как параметр ALL не используется и все повторяющиеся строки удаляются.The second UNION is processed first because it is in parentheses, and returns 5 rows because the ALL option is not used and the duplicates are removed. Полученные 5 строк совмещаются с результатами выполнения первой инструкции SELECT с помощью ключевого слова UNION ALL.These 5 rows are combined with the results of the first SELECT by using the UNION ALL keywords. В данном случае повторяющиеся строки двух множеств не удаляются.This does not remove the duplicates between the two sets of 5 rows. Окончательный результат состоит из 10 строк.The final result has 10 rows.

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

Примеры: Хранилище данных SQL AzureAzure SQL Data Warehouse и Параллельное хранилище данныхParallel Data WarehouseExamples: Хранилище данных SQL AzureAzure SQL Data Warehouse and Параллельное хранилище данныхParallel Data Warehouse

Д.E. Использование простого UNIONUsing a simple UNION

При выполнении приведенного ниже примера в результирующий набор включается содержимое столбцов CustomerKey таблиц FactInternetSales и DimCustomer.In the following example, the result set includes the contents of the CustomerKey columns of both the FactInternetSales and DimCustomer tables. Так как ключевое слово ALL не используется, повторяющиеся значения не включаются в результаты.Since the ALL keyword is not used, duplicates are excluded from the results.

-- Uses AdventureWorks  

SELECT CustomerKey   
FROM FactInternetSales    
UNION   
SELECT CustomerKey   
FROM DimCustomer   
ORDER BY CustomerKey;  

Е.F. Использование UNION двух инструкций SELECT с ORDER BYUsing UNION of two SELECT statements with ORDER BY

Если какая-либо инструкция SELECT в инструкции UNION содержит предложение ORDER BY, это предложение должно находиться после всех инструкций SELECT.When any SELECT statement in a UNION statement includes an ORDER BY clause, that clause should be placed after all SELECT statements. В приведенном ниже примере показаны случаи правильного и неправильного использования UNION в двух инструкциях SELECT, в которых столбец сортируется с помощью предложения ORDER BY.The following example shows the incorrect and correct use of UNION in two SELECT statements in which a column is ordered with 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. Использование UNION двух инструкций SELECT с WHERE и ORDER BYUsing UNION of two SELECT statements with WHERE and ORDER BY

В приведенном ниже примере показаны случаи правильного и неправильного использования UNION в двух инструкциях SELECT, в которых требуются предложения WHERE и ORDER BY.The following example shows the incorrect and correct use of UNION in two SELECT statements where WHERE and ORDER BY are needed.

-- 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. Использование UNION трех инструкций SELECT для демонстрации эффекта от использования скобок и ALLUsing UNION of three SELECT statements to show effects of ALL and parentheses

В приведенных ниже примерах UNION используется для объединения результатов из той же самой таблицы с целью продемонстрировать эффект от применения ALL и скобок с UNION.The following examples use UNION to combine the results of the same table in order to demonstrate the effects of ALL and parentheses when using UNION.

В первом примере UNION ALL используется для вывода повторяющихся записей. Каждая строка из исходной таблицы возвращается три раза.The first example uses UNION ALL to show duplicated records and returns each row in the source table three times. Во втором примере UNION используется без ключевого слова ALL, что позволяет удалить повторяющиеся строки из объединенных результатов выполнения трех инструкций SELECT и вывести только неповторяющиеся строки из исходной таблицы.The second example uses UNION without ALL to eliminate the duplicate rows from the combined results of the three SELECT statements and returns only the unduplicated rows from the source table.

В третьем примере с первым оператором UNION используется ключевое слово ALL, а во втором предложении UNION вместо ключевого слова ALL используются скобки.The third example uses ALL with the first UNION and parentheses enclosing the second UNION that is not using ALL. Второе предложение UNION обрабатывается первым, так как оно заключено в скобки.The second UNION is processed first because it is in parentheses. Оно возвращает только неповторяющиеся строки из таблицы, так как параметр ALL не используется и повторяющиеся строки исключаются.It returns only the unduplicated rows from the table because the ALL option is not used and duplicates are removed. Полученные строки объединяются с результатами выполнения первой инструкции SELECT с помощью ключевого слова UNION ALL.These rows are combined with the results of the first SELECT by using the UNION ALL keywords. В данном случае повторяющиеся строки двух множеств не удаляются.This does not remove the duplicates between the two sets.

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

См. также:See Also

SELECT (Transact-SQL) SELECT (Transact-SQL)
Примеры использования инструкции SELECT (Transact-SQL)SELECT Examples (Transact-SQL)