UNION-объединения – операции вертикального объединения результатов запросов — КиберПедия 

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций...

UNION-объединения – операции вертикального объединения результатов запросов

2020-05-08 240
UNION-объединения – операции вертикального объединения результатов запросов 0.00 из 5.00 0 оценок
Заказать работу


Я специально использую словосочетания горизонтальное соединение и вертикальное объединение, т.к. заметил, что новички часто недопонимают и путают суть этих операций.

Давайте первым делом вспомним как мы делали первую версию отчета для директора:

SELECT

'Администрация' Info,

COUNT(DISTINCT PositionID) PositionCount,

COUNT(*) EmplCount,

SUM(Salary) SalaryAmount

FROM Employees

WHERE DepartmentID=1 -- данные по Администрации

 

SELECT

'Бухгалтерия' Info,

COUNT(DISTINCT PositionID) PositionCount,

COUNT(*) EmplCount,

SUM(Salary) SalaryAmount

FROM Employees

WHERE DepartmentID=2 -- данные по Бухгалтерии

 

SELECT

'ИТ' Info,

COUNT(DISTINCT PositionID) PositionCount,

COUNT(*) EmplCount,

SUM(Salary) SalaryAmount

FROM Employees

WHERE DepartmentID=3 -- данные по ИТ отделу

 

SELECT

'Прочие' Info,

COUNT(DISTINCT PositionID) PositionCount,

COUNT(*) EmplCount,

SUM(Salary) SalaryAmount

FROM Employees

WHERE DepartmentID IS NULL -- и еще не забываем данные по внештатникам

 

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

SELECT

'Администрация' Info,

COUNT(DISTINCT PositionID) PositionCount,

COUNT(*) EmplCount,

SUM(Salary) SalaryAmount

FROM Employees

WHERE DepartmentID=1 -- данные по Администрации

UNION ALL

SELECT

'Бухгалтерия' Info,

COUNT(DISTINCT PositionID) PositionCount,

COUNT(*) EmplCount,

SUM(Salary) SalaryAmount

FROM Employees

WHERE DepartmentID=2 -- данные по Бухгалтерии

UNION ALL

SELECT

'ИТ' Info,

COUNT(DISTINCT PositionID) PositionCount,

COUNT(*) EmplCount,

SUM(Salary) SalaryAmount

FROM Employees

WHERE DepartmentID=3 -- данные по ИТ отделу

UNION ALL

SELECT

'Прочие' Info,

COUNT(DISTINCT PositionID) PositionCount,

COUNT(*) EmplCount,

SUM(Salary) SalaryAmount

FROM Employees

WHERE DepartmentID IS NULL -- и еще не забываем данные по внештатникам

 

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

Соответственно количество колонок в каждом запросе должно быть одинаковым, а также должны быть совместимыми и типы этих колонок, т.е. строка под строкой, число под числом, дата под датой и т.п.

Немного теории


В MS SQL реализованы следующие виды вертикального объединения:

Операция Описание
UNION ALL В результат включаются все строки из обоих наборов. (A+B)
UNION В результат включаются только уникальные строки двух наборов. DISTINCT(A+B)
EXCEPT В результат попадают уникальные строки верхнего набора, которые отсутствуют в нижнем наборе. Разница 2-х множеств. DISTINCT(A-B)
INTERSECT В результат включаются только уникальные строки, присутствующие в обоих наборах. Пересечение 2-х множеств. DISTINCT(A&B)


Все это проще понять на наглядном примере.

Создадим 2 таблицы и наполним их данными:

CREATE TABLE TopTable(

T1 int,

T2 varchar(10)

)

GO

 

CREATE TABLE BottomTable(

B1 int,

B2 varchar(10)

)

GO

 

INSERT TopTable(T1,T2)VALUES

(1,'Text 1'),

(1,'Text 1'),

(2,'Text 2'),

(3,'Text 3'),

(4,'Text 4'),

(5,'Text 5')

 

 

INSERT BottomTable(B1,B2)VALUES

(2,'Text 2'),

(3,'Text 3'),

(6,'Text 6'),

(6,'Text 6')

 

Посмотрим на содержимое:

SELECT *

FROM TopTable

 

T1 T2
1 Text 1
1 Text 1
2 Text 2
3 Text 3
4 Text 4
5 Text 5

 

SELECT *

FROM BottomTable

 

B1 B2
2 Text 2
3 Text 3
6 Text 6
6 Text 6

 

UNION ALL

 

SELECT T1 x,T2 y

FROM TopTable

 

UNION ALL

 

SELECT B1,B2

FROM BottomTable

 

UNION

 

SELECT T1 x,T2 y

FROM TopTable

 

UNION

 

SELECT B1,B2

FROM BottomTable

 

По сути UNION можно представить, как UNION ALL, к которому применена операция DISTINCT:

EXCEPT

 

SELECT T1 x,T2 y

FROM TopTable

 

EXCEPT

 

SELECT B1,B2

FROM BottomTable

 

INTERSECT

 

SELECT T1 x,T2 y

FROM TopTable

 

INTERSECT

 

SELECT B1,B2

FROM BottomTable

 


Поделиться с друзьями:

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...

Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...

Своеобразие русской архитектуры: Основной материал – дерево – быстрота постройки, но недолговечность и необходимость деления...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.014 с.