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

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

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

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

2020-05-08 245
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.016 с.