Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка SQL(14) (оптимизация).docx
Скачиваний:
62
Добавлен:
17.03.2015
Размер:
452.16 Кб
Скачать

4.6. Объединение запросов union.

Операцию соединения можно представить как присоединение строки одной таблицы к строке другой таблицы — горизонтальную конкатенацию. Операция объединения же действует как вертикальная конкатенация — второй набор результатов добавляется в конец первого набора.

Основные правила объединения результирующих наборов двух запросов с помощью операции UNION:

  • Количество и порядок столбцов должны быть одинаковыми во всех запросах.

  • Тип данных должен быть совместимым.

Синтаксис:

<оператор_SELECT >

UNION [ ALL ]

< оператор_SELECT >

[ UNION [ ALL ] <оператор_SELECT > … ]

Где:

<оператор_SELECT > — это запрос, возвращающий данные для объединения с данными из другого запроса. Определения столбцов, которые являются частью операции UNION, могут не совпадать, однако должны быть совместимыми посредством неявного преобразования.

UNION — указывает на то, что несколько результирующих наборов следует объединить и возвратить в виде единого результирующего набора. Дубликаты строк удаляются.

UNION ALL — объединяет в результирующий набор все строки. Это относится и к дублирующимся строкам.

Пример 38.

Результат

ID_Продукта

10

11

12

15

16

Например, выдать названия продуктов, в которых нет жиров, либо входящих в состав блюда с кодом БЛ = 1:

SELECT Продукт

FROM Продукты

WHERE Жиры IS NULL

UNION

Результат

ID_Продукта

4

11

12

15

SELECT Продукт

FROM Состав

WHERE Блюдо = 1;

Результат объединения

Результат

ID_Продукта

4

10

11

12

15

16

Из этого простого примера видно, что избыточные дубликаты всегда исключаются из результата UNION. Поэтому, хотя в рассматриваемом примере Помидоры(11), Зелень(12) и Яблоки(15) выбираются обеими частями из двух составляющих предложения SELECT, в окончательном результате они появляются только один раз.

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

UNION

SELECT Продукт

FROM Продукты

WHERE Ca < 250;

позволяющую добавить к списку продуктов Масло, Рис, Мука и Кофе. Однако тот же результат можно получить простым изменением фразы WHERE первой части исходного запроса

WHERE Жиры = 0 OR Ca < 250;

4.6.1. Union и устранение дубликатов.

UNION будет автоматически исключать дубликаты строк из вывода. Это нечто несвойственное для SQL, так как одиночные запросы обычно содержат DISTINCT чтобы устранять дубликаты. Например, запрос

Пример 39.

SELECT Блюдо, Количество_порций

FROM Заказы

WHERE Дата = '2011-01-02'

UNION

SELECT Блюдо, Количество_порций

FROM Заказы

WHERE Дата = '2011-01-03';

может иметь повторные комбинации значений (Блюдо, Количество_порций), так как некоторые блюда в разные дни могли заказываться в одинаковом количестве. Однако если мы используем UNION в построении этого запроса, повторные комбинации будет устранены, что в дальнейшем, при вычислении выручки, приведет к ошибке. Для решения проблемы устранения повторяющихся строк необходимо использовать UNION ALL.

SELECT Блюдо, Количество_порций

FROM Заказы WHERE Дата = '2011-01-02'

UNION ALL

SELECT Блюдо, Количество_порций

FROM Заказы WHERE Дата = '2011-01-03';