Объединение наборов записей (UNION)

Теоретико-множественные операции

Над наборами записей, содержащихся в таблицах базы данных и/или возвращаемых запросами, можно совершать теоретико-множественные операции, такие как декартово произведение, объединение, пересечение и вычитание.

Декартово произведение наборов записей

Запрос SELECT списокСтолбцов FROM Т1, Т2, ... Тn;

возвращает набор записей, полученный в результате декартового произведения наборов записей из таблиц T1, T2,..., Тn. Таблицы, указанные в операторе FROM, могут быть как таблицами базы дан­ных, так и виртуальными таблицами, возвращаемыми какими-нибудь запросами.

Иногда требуется получить декартово произведение таблицы са­мой на себя. В этом случае необходимо применить различные псевдонимы для этой таблицы, например:

SELECT списокСтолбцов FROM Mytab T1, Mytab T2;

Обратите внимание, что попытка выполнить запрос:

SELECT списокСтолбцов FROM Mytab, Mytab;

приведет к ошибке.

В списке столбцов следует использовать полные имена столбцов, используя псевдонимы таблиц, или символ (*), если требуется получить все столбцы.

Для декартова произведения в SQL также допустим синтаксис с ключевыми словами CROSS JOIN (перекрестное соединение):

SELECT списокСтолбцов FROM Mytab T1 CROSS JOIN Mytab T2;

Примечание:

Рассмотренные выражения работают в полнофункциональных ба­зах данных. В Microsoft Access для получения декартового произ­ведения возможно использование выражения (SELECT списокСтолбцов FROM T1, T2, ... Tn), только если все таблицы в списке имеют различные имена. Если требуется декартово про­изведение таблицы самой на себя, то в выражении (select списокСтолбцов FROM Mytab T1, Mytab T2) Access автоматически добавит ключевое слово AS перед каждым псевдонимом. Попытка использования ключевых слов CROSS JOIN в Access приведет к ошибке.

Запросы на декартово произведение сами по себе очень редко используются. Они приобретают некоторый смысл, если приме­няются с оператором WHERE.

èПример:

Допустим, что имеется таблица Рейсы (НАЧАЛЬНЫЙ_ПУНКТ, КОНЕЧНЫЙ_ПУНКТ), содержащая сведения о том, из каких пунктов и в какие можно попасть с помощью того или иного авиарейса.

На рис. показан граф достижимости пунктов некоторым авиа­рейсом и соответствующая ему таблица Рейсы. Каждой стрелке на графе и каждой записи таблицы соответствует некоторый рейс. Не трудно заметить, что из некоторых пунктов в другие можно попасть только спересадкой на другой рейс, т. е.через транзитный пункт. Следующий запрос возвращает таблицу (рис. ниже), содержащую сведения о достижимости пунктов в точ­ности через один транзитный пункт:

SELECT Т1.НАЧАЛЬНЫЙ_ПУНКТ, Т2.КОНЕЧНЫЙ_ПУНКТ

FROM Рейсы Т1, Рейсы Т2

WHERE T1.КОНЕЧНЫЙ_ПУНКТ = Т2.НАЧАЛЬНЫЙ_ПУНКТ;

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

Т1.НАЧАЛЬНЫЙ_ПУНКТ,

Т1.КОНЕЧНЫЙ__ПУНКТ,

Т 2 .НАЧАЛЬНЫЙ_ПУНКТ

и Т2.КОНЕЧНЫЙ_ПУНКТ.

Затем из полученной таблицы выбираются такие записи, в которых Т1.КОНЕЧНЫЙ_ПУНКТ = Т2.НАЧАЛЬШЙ_ПУНКТ. Это и есть пары пунктов, между которыми в графе достижимо­сти находится один промежуточный пункт. Наконец, из четы­рех столбцов выделяются только два: Т1.НАЧАЛЬНЫЙ_ПУНКТ и Т2.КОНЕЧНЫЙ_ПУНКТ.

Объединение наборов записей (UNION)

Нередко требуется объединить записи двух или более таблиц с похожими структурами в одну таблицу. Иначе говоря, к набору записей, возвращаемому одним запросом, требуется добавить записи, возвращаемые другим запросом. Для этого служит опера­тор union (объединение):

Запрос1 UNION Запрос2;

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

Например, таблицы клиенты и контакты имеют однотипные столбцы Имя и Адрес. Тогда, чтобы пополнить список данных о клиентах сведениями из таблицы контакты, достаточно выпол­нить следующий запрос: