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

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

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

2020-05-08 277
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

 


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

Особенности сооружения опор в сложных условиях: Сооружение ВЛ в районах с суровыми климатическими и тяжелыми геологическими условиями...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

История развития хранилищ для нефти: Первые склады нефти появились в XVII веке. Они представляли собой землянные ямы-амбара глубиной 4…5 м...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...



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

0.017 с.