Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Белобжеский_Лекции_по_ББД.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
5.5 Mб
Скачать

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

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

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

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

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

SELECT Имя, Адрес FROM Клиенты

UNION

SELECT Имя, Адрес FROM Контакты;

Возможно, что в обеих объединяемых таблицах, Клиенты и Контакты, имеются записи с одинаковыми парами значений в столбцах Имя и Адрес. Однако в результатной таблице данного запроса повторений не будет, как если бы вы использовали опе­ратор UNION DISTINCT.

Оператор union можно применять только к таблицам, удовлетворяющим следующим условиям совместимости:

  • количества столбцов объединяемых таблиц должны быть равны;

  • данные в соответствующих столбцах объединяемых таблиц должны иметь совместимые типы. Например, символьные (строковые) типы char и varchar совместимы, а числовой и строковый типы не совместимы.

Обратите внимание, что имена соответствующих столбцов и их размеры могут быть различными. Важно, чтобы количества столбцов были равны, а их типы были совместимы. Чтобы объединить наборы записей с несовместимыми по типу данных столбцами, следует применить функцию преобразования типа данных cast (). Например, следующий запрос возвращает список имен клиентов, к которому добавлен список сумм заказов (не будем обсуждать практическую пользу или смысл такого списка):

SELECT Имя FROM Клиенты

UNION

SELECT САSТ(Сумма_заказа AS CHAR(10)) FROM Клиенты;

Когда требуется объединить записи двух таблиц, имеющих од­ноименные столбцы с совместимыми типами, можно использо­вать оператор union corresponding (объединение соответст­вующих):

SELECT * FROM Таблица!

UNION CORRESPONDING (списокСтолбцов)

SELECT * FROM Таблица2;

После ключевого слова corresponding можно указать столбцы, имеющиеся одновременно в обеих таблицах. Если этот список столбцов не указан, то предполагается список всех имен. При этом возможны недоразумения.

В разд. 5.2.1 рассматривался запрос, возвращающий таблицу со сведениями о достижимости пунктов в точности через один промежуточный пункт (см. рис 5.4, 5 5). Теперь сформулируем запрос по-другому: требуется получить сведения о том, в какие пункты можно попасть, сделав не более одной пересадки (т. е. без пересадок или с одной пересадкой). Для этого достаточно объединить записи исходной таблицы Рейсы с результатом запроса о достижимости через один промежуточный пункт:

SELECT НАЧАЛЬНЫЙ_ПУНКТ, КОНЕЧНЫЙ_ПУHKT FROM Рейсы

UNION

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

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

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

Результат данного запроса показан на рис. 5.6.

Аналогичным образом можно сформулировать запрос о дости­жимости пунктов, в которые можно попасть посредством не бо­лее двух, трех и т. д. пересадок. Запрос, содержащий сведения о том, в какие пункты вообще можно попасть, будет рассмотрен далее в разд 5 3.5.

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

SELECT НАЧАЛЬНЫЙ_ПУНКТ, КОНЕЧНЫЙ_ПУНКТ FROM Рейсы

UNION

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

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

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

AND Т1.НАЧАЛЬНЫЙ_ПУНКТ = 'А';

Рис. 5.6. Тaблицa достижимости пунктов, в которые можно попасть, сделав не более одной пересадки

Вместе с тем, допустим и такой эквивалентный запрос:

SELECT * FROM (

SELECT НАЧАЛЬНЫЙ_ПУНКТ, КОНЕЧНЫЙ_ПУНКТ FROM Рейсы

UNION

SELECT Т1.НАЧАЛЬНЫЙ_ПУНКТ, Т2.КОНЕЧНЫЙ_ПУНКТ FROM Рейсы Т1, Рейсы Т2

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

WHERE Т.НАЧАЛЬНЫЙ_ПУНКТ = 'А';

Здесь для таблицы, получаемой в результате сложного запроса в скобках, используется псевдоним Т – обратите внимание.