Поиск…


Вступление

Ключевое слово UNION в SQL используется для объединения результатов SELECT с любым дубликатом. Чтобы использовать UNION и комбинировать результаты, оператор SELECT должен иметь одинаковое количество столбцов с одинаковым типом данных в том же порядке, но длина столбца может быть разной.

Синтаксис

  • SELECT column_1 [, column_2] FROM table_1 [, table_2] [Условие WHERE]
    СОЮЗ | СОЮЗ ВСЕ
    SELECT column_1 [, column_2] FROM table_1 [, table_2] [Условие WHERE]

замечания

UNION и UNION ALL объединяют результирующий набор из двух или более идентично структурированных операторов SELECT в единый результат / таблицу.

Оба столбца и типы столбцов для каждого запроса должны совпадать, чтобы работать с UNION / UNION ALL .

Разница между запросом UNION и UNION ALL заключается в том, что предложение UNION удалит любые повторяющиеся строки в результате, когда UNION ALL не будет.

Это отличное удаление записей может значительно замедлить запросы, даже если нет четких строк, которые должны быть удалены из-за этого, если вы знаете, что не будет никаких дубликатов (или не важно) всегда по умолчанию для UNION ALL для более оптимизированного запроса.

Основной запрос UNION ALL

CREATE TABLE HR_EMPLOYEES
(
    PersonID int,
    LastName VARCHAR(30),
    FirstName VARCHAR(30),
    Position VARCHAR(30)
);

CREATE TABLE FINANCE_EMPLOYEES
(
    PersonID INT,
    LastName VARCHAR(30),
    FirstName VARCHAR(30),
    Position VARCHAR(30)
);

Предположим, мы хотим извлечь имена всех managers из наших отделов.

Используя UNION мы можем получить всех сотрудников из отдела кадров и финансов, которые занимают position manager

SELECT 
    FirstName, LastName   
FROM 
    HR_EMPLOYEES  
WHERE 
    Position = 'manager'  
UNION ALL  
SELECT 
    FirstName, LastName  
FROM 
    FINANCE_EMPLOYEES  
WHERE 
    Position = 'manager'  

Оператор UNION удаляет повторяющиеся строки из результатов запроса. Поскольку в обоих отделах есть люди с одинаковым именем и позицией, мы используем UNION ALL , чтобы не удалять дубликаты.

Если вы хотите использовать псевдоним для каждого столбца вывода, вы можете просто поместить их в первый оператор select, как показано ниже:

SELECT 
    FirstName as 'First Name', LastName as 'Last Name'
FROM 
    HR_EMPLOYEES  
WHERE 
    Position = 'manager'  
UNION ALL  
SELECT 
    FirstName, LastName  
FROM 
    FINANCE_EMPLOYEES  
WHERE 
    Position = 'manager'  

Простое объяснение и пример

Проще говоря:

  • UNION объединяет 2 набора результатов при удалении дубликатов из набора результатов
  • UNION ALL объединяет 2 набора результатов, не пытаясь удалить дубликаты

Одна из ошибок, которую делают многие люди, - использовать UNION когда им не нужно удалять дубликаты. Дополнительные затраты по сравнению с большими наборами результатов могут быть очень значительными.

Когда вам понадобится UNION

Предположим, вам нужно отфильтровать таблицу с двумя разными атрибутами, и вы создали отдельные некластеризованные индексы для каждого столбца. UNION позволяет вам использовать оба индекса при одновременном предотвращении дублирования.

SELECT C1, C2, C3 FROM Table1 WHERE C1 = @Param1
UNION
SELECT C1, C2, C3 FROM Table1 WHERE C2 = @Param2

Это упрощает настройку производительности, поскольку для оптимального выполнения этих запросов необходимы простые индексы. Вы даже можете обойтись с небольшим количеством некластеризованных индексов, улучшая общую производительность записи по сравнению с исходной таблицей.

Когда вам может понадобиться UNION ALL

Предположим, вам по-прежнему необходимо отфильтровать таблицу по двум атрибутам, но вам не нужно фильтровать повторяющиеся записи (либо потому, что это не имеет значения, либо ваши данные не будут создавать дубликатов во время объединения из-за вашей модели данных).

SELECT C1 FROM Table1
UNION ALL
SELECT C1 FROM Table2

Это особенно полезно при создании представлений, которые объединяют данные, которые предназначены для физического разделения по нескольким таблицам (возможно, по соображениям производительности, но по-прежнему хотят свертывать записи). Так как данные уже разделены, то с помощью механизма удаления базы данных дубликаты не добавляют значения и просто добавляют дополнительное время обработки к запросам.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow