Объединение результатов нескольких запросов

Иногда появляется необходимость объединения результатов двух или более запросов в одну таблицу. Язык SQL предусматривает такую возможность с помощью оператора UNION. Например, можно объединить результаты, выполнив следующий сложный оператор, и получить результат, показанный на рис. 3.14:

SELECT ADR, POL FROM PERSON

WHERE SUMD<2000.00 UNION

SELECT ADR, KCATEGORY FROM FLAT

WHERE SKV<30.00

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

  • 1) таблицы должны содержать одинаковое число столбцов;
  • 2) тип данных каждого столбца первой таблицы должен совпадать с типом данных соответствующего столбца во второй таблице;
  • 3) ни одна из таблиц не может быть отсортирована с помощью предложения ORDER BY, однако объединенные результаты запроса можно отсортировать.

Обратите внимание на то, что имена столбцов в объединяемых таблицах не обязательно должны быть одинаковыми.

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

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

Использование оператора UNION

Рис. 3.14. Использование оператора UNION

умолчанию оператор UNION в процессе своего выполнения удаляет повторяющиеся строки.

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

Хотя предложение ORDER BY нельзя использовать в составляющих операторах SELECT, объединенных оператором UNION, результирующую объединенную таблицу можно отсортировать, записав предложение ORDER BY за последним оператором SELECT. Поскольку столбцы в таблице результатов запроса на объединение не имеют имен, то в предложении ORDER BY следует указывать номера столбцов.

Оператор UNION можно использовать многократно, чтобы объединить результаты трех или более запросов, например:

SELECT * FROM А

UNION (SELECT * FROM В UNION SELECT * FROM C)

Скобки показывают, какой оператор UNION должен выполняться первым.

Если используются одинаковые формы оператора UNION (т.е. только UNION либо только UNION ALL), то порядок выполнения операторов не имеет значения. Следующие операторы полностью эквивалентны:

A UNION (В UNION С)

(A UNION В ) UNION С (A UNION С) UNION В

Эквивалентными являются и такие операторы:

A UNION ALL (В UNION ALL С)

(A UNION ALL В) UNION ALL С (A UNION ALL C) UNION ALL В

Однако если в запросы на объединения входят как операторы UNION, так и операторы UNION ALL, то порядок следования этих операторов имеет значение. Если операторы A UNION ALL В UNION С проинтерпретировать как А UNION ALL (В UNION С), то таблица результатов может содержать повторяющиеся строки. Однако если эти операторы проинтерпретировать как (A UNION ALL В) UNION С, то в таблице результатов повторяющихся строк не будет.

По этой причине всегда нужно использовать круглые скобки, чтобы указать последовательность выполнения операторов.

 
Посмотреть оригинал
< Пред   СОДЕРЖАНИЕ   ОРИГИНАЛ     След >