Объединение результатов нескольких запросов
Иногда бывает необходимо объединять результаты выполнения двух и более SELECT -инструкций. Эту операцию можно выполнить при помощи предложения UNION <$I[]UNION в SQL-инструкции SELECT>. Поскольку результатом всего запроса является один набор, каждый из запросов, объединяемых предложением UNION, должен содержать одинаковое количество полей с одинаковыми типами данных — практически, объединяются тождественные наборы. Можно написать сколь угодно сложную SELECT -инструкцию, добавить к ней слово UNION, за которым будет другая SELECT -инструкция и т.д., но все SELECT -инструкции должны возвращать одинаковые наборы. Для демонстрации работы с объединением, представим себе, что по не обсуждаемым здесь причинам мы имеем более одного mdb-файла со структурой рассматриваемого до сих пор файла фирма.mdb. Таблицы Товары файлов, например, фирма1.mdb и фирма2.mdb представлены на рис. 15.39–15.40 и, в общем-то, могут содержать одинаковые записи. Рис. 15.39 Таблица Товары файла фирма1.mdb Рис. 15.40 Таблица Товары файла фирма2.mdb Для получения общей ведомости товаров можно использовать следующую инструкцию: SELECT НаимТовара AS Наименование, Format(Цена1, "### ##0.00р") AS [Цена оптовая] FROM Товары IN 'c:\фирма1.mdb' UNION SELECT НаимТовара AS Наименование, Format(Цена1, "### ##0.00р") AS [Цена оптовая] FROM Товары IN 'c:\фирма2.mdb' Как видно из результата запроса (рис. 15.41), в полученном наборе нет повторяющихся записей. Это — свойство объединения: записи результирующих наборов не повторяются. Если же вы измените в одной из таблиц для повторяющего товара значение в поле Цена1 (Цена2 не входит в запрос), то в результирующем наборе это наименование появится дважды, но с разными ценами (рис. 15.42). Рис. 15. 41 Результирующий запрос-объединение Рис. 15. 42 Результирующий запрос-объединение При помощи предложения UNION ALL можно получить в одном наборе все записи первой и второй таблицы, даже если в таблицах имеются одинаковые записи (одинаковые значения во всех полях). В запросе, использующем UNION, можно упорядочивать результирующие записи предложением ORDER BY. При этом допустимо только одно предложение ORDER BY, которое следует располагать после всех предложений SELECT и которое действует для обоих запросов. Например: SELECT НаимТовара AS Наименование, Format(Цена1, "### ##0.00р") AS [Цена оптовая] FROM Товары IN 'c:\фирма1.mdb' UNION SELECT НаимТовара AS Наименование, Format(Цена1, "### ##0.00р") AS [Цена оптовая] FROM Товары IN 'c:\фирма2.mdb' ORDER BY 2 Результат выполнения этого запроса мог бы выглядеть так, как представлено на рис. 15.44. Рис. 15. 44 Использование ORDER BY в запросе-объединении
|