Иногда вам может потребоваться объединить записи из одной таблицы или запроса с записями из одной или нескольких других таблиц в один результат. Именно это и делает запрос на объединение в Access.
Чтобы хорошо понимать запросы на объединение, нужно уметь создавать базовые запросы на выборку в Access. Подробнее о них читайте в статье Создание простого запроса на выборку.
Пример запроса на объединение
Если вы никогда раньше не создавали запросы на объединение, возможно, вам будет полезно сначала изучить рабочий пример в шаблоне Northwind Access. Вы можете найти пример шаблона Northwind на странице начала работы Access, выбрав"Создатьфайл>". Вы также можете загрузить копию непосредственно из примера шаблона Northwind.
После открытия базы данных Northwind закройте появившееся диалоговое окно входа в систему, а затем разверните область навигации. Щелкните верхнюю часть области навигации и выберите "Тип объекта ", чтобы упорядочить все объекты базы данных по типам. Затем разверните группу "Запросы ", и вы увидите запрос " Транзакции с продуктами".
Запросы на объединение легко отличить от других объектов запросов, так как они помечены специальным значком, который напоминает два пересекающихся круга (он символизирует объединение двух множеств):
В отличие от обычных запросов на выделение и на действия таблицы не связаны в запросе на объединение. Это означает, что с помощью конструктора запросов Access невозможно создавать или редактировать запросы на объединение. Если запрос на объединение открыт в области навигации, Access откроет его и выведет результаты в режиме таблицы. Обратите внимание, что в разделе "Представления " на вкладке " Главная " режим конструктора недоступен при работе с запросами на объединение. Переключаться можно только между режимами таблицы и SQL.
Чтобы продолжить изучение данного примера запроса на объединение, щелкните Главная>Views>SQL View , чтобы просмотреть SQL синтаксис, определяющий этот запрос. На этом рисунке мы добавили интервалы SQL , чтобы вы могли легко увидеть различные части, из которых состоит запрос на объединение.
SQL Рассмотрим синтаксис этого запроса на объединение из базы данных Northwind.
SELECT [Product ID], [Order Date], [Company Name], [Transaction], [Quantity]
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity]
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Первая и третья части этой инструкции SQL по сути являются запросами на выборку. Эти запросы получают два разных набора записей: из таблицы Заказы на товары и из таблицы Закупки товаров.
Вторая часть этого SQL утверждения — UNION это ключевое слово, указывающее Access объединить эти два набора записей.
Последняя часть этой SQL инструкции определяет порядок объединенных записей с помощью ORDER BY инструкции. В этом примере все записи в Access упорядочены по полю "Дата заказа" в порядке убывания.
Примечание
Запросы на объединение всегда доступны только для чтения; вы не сможете изменить никакие значения в режиме таблицы.
Создание запроса на объединение путем объединения запросов на выборку
Хотя вы можете создать запрос на объединение, написав синтаксис непосредственно SQL в представлении SQL, возможно, вам будет проще создать его по частям с помощью запросов select. Затем можно скопировать части кода SQL и вставить их в общий запрос на объединение.
Вы можете пропустить эти инструкции и просмотреть видео с примером в следующем разделе (Пример создания запроса на объединение).
- На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
- Дважды щелкните таблицу с полями, которые нужно включить. Таблица будет добавлена в окно конструктора запросов.
- В окне конструктора запросов дважды щелкните поля, которые нужно включить. При выборе полей убедитесь, что добавляется такое же число полей и в таком же порядке, как при добавлении в другие запросы на выборку. Уделите особое внимание типам данных полей, и убедитесь, что они совместимы с типами данных полей в таких же положениях в других объединяемых запросах. Например, если сначала был выбран запрос с пятью полями, первое из которых содержит дату и время, убедитесь, чтобы в других объединяемых запросах на выборку также было по пять полей, первое из которых содержит дату и время, и т. д.
- Дополнительно к полям можно добавить условия, введя соответствующие выражения в строке "Условия" сетки полей.
- После добавления полей и их условий выполните запрос на выборку и проверьте его выходные данные. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
- Переключите запрос в конструктор.
- Сохраните запрос на выборку и не закрывайте его.
- Повторите эту процедуру для всех запросов на выборку, которые необходимо объединить.
Теперь, когда вы создали запросы на выборку, пришло время объединить их. На этом шаге создается запрос на объединение путем копирования и вставки SQL инструкций.
- На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
- На вкладке Конструктор в группе Тип запроса щелкните Объединение. Приложение Access скрывает окно конструктора запросов и открывает вкладку объекта "Представление SQL ". На данный момент вкладка пуста.
- Щелкните вкладку первого запроса на выборку, который вы хотите добавить в запрос на объединение.
- На вкладке "Главная" щелкните "Просмотр>в режиме SQL".
- Скопируйте
SQLинструкцию для запроса на выборку. Щелкните вкладку запроса на объединение, который вы начали создавать ранее. - Вставьте инструкцию
SQLдля запроса select на вкладку объектов SQL View запроса на объединение. - Удалите точку с запятой (
;) в конце инструкции запросаSQLна выборку. - Нажмите клавишу ВВОД, чтобы переместить курсор вниз на одну строку, а затем введите
UNIONтекст на новой строке. - Щелкните вкладку следующего запроса на выборку, который необходимо добавить в запрос на объединение.
- Повторяйте шаги с 5 по 10, пока не скопируете и не вставите все
SQLоператоры для запросов select в окно "Представление SQL " запроса на объединение. Не удаляйте точку с запятой и не вводите что-либо послеSQLинструкции для последнего запроса SELECT. - На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Результаты запроса на объединение отобразятся в режиме таблицы.
Пример создания запроса на объединение
Вот пример, который можно воссоздать в примере базы данных Northwind. Этот запрос на объединение собирает имена людей из таблицы Customers и объединяет их с именами из таблицы Поставщики. Чтобы изучить пример, выполняйте эти инструкции в своей копии базы данных "Борей".
Чтобы создать запрос, нужно выполнить следующие действия:
Создайте два запроса на выборку ("Запрос1" и "Запрос2"), указав в качестве источников их данных таблицы Customers и "Поставщики" соответственно. В качестве отображаемых значений используйте поля "Имя" и "Фамилия".
Создайте запрос ("Запрос3"), в котором изначально нет источника данных, и нажмите кнопку Объединение на вкладке Конструктор, чтобы сделать его запросом на объединение.
Скопируйте инструкции SQL из запросов "Запрос1" и "Запрос2" и вставьте их в "Запрос 3". Не забудьте удалить лишнюю точку с запятой и добавить
UNIONключевое слово. Вы можете проверить результаты в режиме таблицы.Добавьте предложение упорядочивания в один из запросов, а затем вставьте инструкцию
ORDER BYв запрос объединения в режиме SQL. Обратите внимание на то, что при добавлении инструкции ORDER BY в "Запрос3" сначала удаляются точки с запятой, а затем названия таблиц из имен полей.В конечном
SQLитоге имена для этого примера запроса на объединение объединяются и сортируются следующим образом:SELECT Customers.Company, Customers.[Last Name], Customers.[First Name] FROM Customers UNION SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name] FROM Suppliers ORDER BY [Last Name], [First Name];
Если вам хорошо знаком с синтаксисом SQL , вы можете написать собственное SQL предложение для запроса на объединение непосредственно в режиме SQL. Тем не менее, может оказаться полезным использовать подход копирования и вставки SQL из других объектов запроса. Каждый запрос может быть намного сложнее, чем примеры простых запросов на выборку, приведенные здесь. Может быть полезно создать и протестировать каждый запрос, прежде чем объединять его в запрос на объединение. Если не удается выполнить запрос на объединение, можно корректировать каждый запрос по отдельности, пока он не будет выполнен успешно, а затем перестроить запрос на объединение с исправленным синтаксисом.
В оставшихся разделах этой статьи вы найдете дополнительные советы и рекомендации по использованию запросов на объединение.
Объединение трех и более таблиц или запросов в запросе
В примере из предыдущего раздела, где используется база данных Northwind, объединяются данные только из двух таблиц. Однако в запрос на объединение очень легко добавить больше таблиц. Например, в результаты приведенного выше запроса может также потребоваться включить имена сотрудников. Для этого добавьте третий запрос и объедините его с существующей инструкцией SQL, используя еще одно ключевое слово UNION:
SELECT Customers.Company, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT Suppliers.Company, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT Employees.Company, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
При просмотре результата в режиме таблицы все сотрудники будут перечислены с примером названия компании, что, вероятно, не очень полезно. Если нужно, чтобы это поле показывало, является ли сотрудник штатным сотрудником, поставщиком или клиентом, можно указать фиксированное значение вместо названия компании. Вот как он SQL выглядит:
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
UNION
SELECT "Supplier" As Employment, Suppliers.[Last Name], Suppliers.[First Name]
FROM Suppliers
UNION
SELECT "In-house" As Employment, Employees.[Last Name], Employees.[First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Вот как результат будет выглядеть в режиме таблицы. В Access выводятся эти пять примеров записей:
| Сотрудник | Фамилия | Имя |
|---|---|---|
| Штатный | Попкова | Мария |
| Штатный | Ильина | Юлия |
| Поставщик | Орлов | Николай |
| Клиент | Шашков | Руслан |
| Клиент | Володин | Виктор |
Вы можете уменьшить объем запроса еще больше, так как Access считывает имена полей вывода только из первого запроса в запросе на объединение. Здесь удаляются выходные данные второго и третьего разделов запросов:
SELECT "Customer" As Employment, [Last Name], [First Name]
FROM Customers
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
UNION
SELECT "In-house", [Last Name], [First Name]
FROM Employees
ORDER BY [Last Name], [First Name];
Фильтрация в запросах на объединение
В запросе объединения Access упорядочивание разрешено только один раз, но вы можете отфильтровать каждый запрос по отдельности. Основываясь на запросе объединения из предыдущего раздела, вот пример, который фильтрует каждый запрос путем добавления WHERE предложения.
SELECT "Customer" As Employment, Customers.[Last Name], Customers.[First Name]
FROM Customers
WHERE [State/Province] = "UT"
UNION
SELECT "Supplier", [Last Name], [First Name]
FROM Suppliers
WHERE [Job Title] = "Sales Manager"
UNION
SELECT "In-house", Employees.[Last Name], Employees.[First Name]
FROM Employees
WHERE City = "Seattle"
ORDER BY [Last Name], [First Name];
В режиме таблицы вы увидите примерно такие результаты:
| Сотрудник | Фамилия | Имя |
|---|---|---|
| Поставщик | Волкова | Марина |
| Штатный | Попкова | Дарья |
| Клиент | Энтин | Михаил |
| Штатный | Ожогина | Инна |
| Поставщик | Немченко | Инга |
| Клиент | Ефимов | Александр |
| Поставщик | Хромов | Евгений |
| Поставщик | Зорин | Антон |
| Штатный | Климов | Сергей |
| Поставщик | Котова | Маргарита |
| Штатный | Корепин | Вадим |
Смешивание типов данных
Если запросы значительно различаются, возникает ситуация, когда выходное поле должно объединять данные разных типов. В таком случае результаты чаще всего возвращаются как текстовые данные, так как в таком виде можно хранить и текст, и числа.
Чтобы понять, как это работает, воспользуемся запросом Операции с товарами в образце базы данных "Борей". Откройте в этой базе данных запрос "Операции с товарами" в режиме таблицы. Последние 10 записей должны выглядеть примерно так:
| ИД товара | Дата размещения | Название | Операция | Количество |
|---|---|---|---|---|
| 77 | 22.01.2006 | Поставщик Б | Закупка | 60 |
| 80 | 22.01.2006 | Поставщик Г | Закупка | 75 |
| 81 | 22.01.2006 | Поставщик А | Закупка | 125 |
| 81 | 22.01.2006 | Поставщик А | Закупка | 200 |
| 7 | 20.01.2006 | Организация Г | Продажа | 10 |
| 51 | 20.01.2006 | Организация Г | Продажа | 10 |
| 80 | 20.01.2006 | Организация Г | Продажа | 10 |
| 34 | 15.01.2006 | Организация Э | Продажа | 100 |
| 80 | 15.01.2006 | Организация Э | Продажа | 30 |
Предположим, что нужно разделить поле Quantity на два: Buy и Sell. Предположим также, что требуется фиксированное нулевое значение для поля, у которого нет значения. Вот как выглядит SQL этот запрос на объединение:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], 0 As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, 0 As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
В режиме таблицы 10 последних записей теперь выглядят следующим образом:
| ИД товара | Дата размещения | Название | Операция | Закупка | Продажа |
|---|---|---|---|---|---|
| 74 | 22.01.2006 | Поставщик Б | Закупка | 20 | 0 |
| 77 | 22.01.2006 | Поставщик Б | Закупка | 60 | 0 |
| 80 | 22.01.2006 | Поставщик Г | Закупка | 75 | 0 |
| 81 | 22.01.2006 | Поставщик А | Закупка | 125 | 0 |
| 81 | 22.01.2006 | Поставщик А | Закупка | 200 | 0 |
| 7 | 20.01.2006 | Организация Г | Продажа | 0 | 10 |
| 51 | 20.01.2006 | Организация Г | Продажа | 0 | 10 |
| 80 | 20.01.2006 | Организация Г | Продажа | 0 | 10 |
| 34 | 15.01.2006 | Организация Э | Продажа | 0 | 100 |
| 80 | 15.01.2006 | Организация Э | Продажа | 0 | 30 |
Что если нужно, чтобы поля с нулевыми значениями были пустыми? Вы можете изменить значение "ничего вместо нуля", SQL добавив Null ключевое слово, как показано ниже.
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Однако в режиме таблицы будет выведен неожиданный результат. В столбце "Закупка" все поля будут пустыми:
| ИД товара | Дата размещения | Название | Операция | Закупка | Продажа |
|---|---|---|---|---|---|
| 74 | 22.01.2006 | Поставщик Б | Закупка | ||
| 77 | 22.01.2006 | Поставщик Б | Закупка | ||
| 80 | 22.01.2006 | Поставщик Г | Закупка | ||
| 81 | 22.01.2006 | Поставщик А | Закупка | ||
| 81 | 22.01.2006 | Поставщик А | Закупка | ||
| 7 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 51 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 80 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 34 | 15.01.2006 | Организация Э | Продажа | 100 | |
| 80 | 15.01.2006 | Организация Э | Продажа | 30 |
Это связано с тем, что типы данных полей определяются Access из первого запроса. В этом примере значение Null не является числом.
Итак, что произойдет, если вставить пустую строку вместо пустого значения в полях? Пример SQL этой попытки может выглядеть следующим образом:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], "" As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, "" As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Когда вы переключитесь в режим таблицы, вы увидите, что Access получает значения "Купить", но преобразует значения в текст. Вы можете определить, что это текстовые значения, поскольку они выравниваются по левому краю в режиме таблицы. Пустая строка в первом запросе не является числом, поэтому вы видите эти результаты. Вы также заметите, что значения Sell также преобразуются в текст, так как записи о покупке содержат пустую строку.
| ИД товара | Дата размещения | Название | Операция | Закупка | Продажа |
|---|---|---|---|---|---|
| 74 | 22.01.2006 | Поставщик Б | Закупка | 20 | |
| 77 | 22.01.2006 | Поставщик Б | Закупка | 60 | |
| 80 | 22.01.2006 | Поставщик Г | Закупка | 75 | |
| 81 | 22.01.2006 | Поставщик А | Закупка | 125 | |
| 81 | 22.01.2006 | Поставщик А | Закупка | 200 | |
| 7 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 51 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 80 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 34 | 15.01.2006 | Организация Э | Продажа | 100 | |
| 80 | 15.01.2006 | Организация Э | Продажа | 30 |
Так как же решить эту проблему?
Одно из решений состоит в том, чтобы заставить запрос ожидать, что значение поля будет числом. Это можно сделать с помощью следующего выражения:
IIf(False, 0, Null)
Условие для проверки , Falseникогда не Trueравно , поэтому выражение всегда возвращает Null. Тем не менее, Access по-прежнему оценивает оба варианта вывода и обрабатывает выходные данные как числовые или Null.
Вот как можно использовать это выражение в нашем примере:
SELECT [Product ID], [Order Date], [Company Name], [Transaction], IIf(False, 0, Null) As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Изменять второй запрос не требуется.
В режиме таблицы теперь будет правильный результат:
| ИД товара | Дата размещения | Название | Операция | Закупка | Продажа |
|---|---|---|---|---|---|
| 74 | 22.01.2006 | Поставщик Б | Закупка | 20 | |
| 77 | 22.01.2006 | Поставщик Б | Закупка | 60 | |
| 80 | 22.01.2006 | Поставщик Г | Закупка | 75 | |
| 81 | 22.01.2006 | Поставщик А | Закупка | 125 | |
| 81 | 22.01.2006 | Поставщик А | Закупка | 200 | |
| 7 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 51 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 80 | 20.01.2006 | Организация Г | Продажа | 10 | |
| 34 | 15.01.2006 | Организация Э | Продажа | 100 | |
| 80 | 15.01.2006 | Организация Э | Продажа | 30 |
Кроме того, этот же результат можно получить, если добавить в начале запроса на объединение еще один запрос:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
Для каждого поля Access возвращает статические значения определенного вами типа данных. Конечно же, выходные данные этого запроса не должны влиять на результаты, поэтому мы указываем для предложения WHERE значение False:
WHERE False
Это небольшая хитрость. Так как условие всегда ложно, запрос ничего не возвращает. Объединив его с существующим кодом SQL, мы получим окончательную инструкцию:
SELECT
0 As [Product ID], Date() As [Order Date],
"" As [Company Name], "" As [Transaction],
0 As Buy, 0 As Sell
FROM [Product Orders]
WHERE False
UNION
SELECT [Product ID], [Order Date], [Company Name], [Transaction], Null As Buy, [Quantity] As Sell
FROM [Product Orders]
UNION
SELECT [Product ID], [Creation Date], [Company Name], [Transaction], [Quantity] As Buy, Null As Sell
FROM [Product Purchases]
ORDER BY [Order Date] DESC;
Примечание
В этом примере объединенный запрос в базе данных Northwind возвращает 100 записей, а два отдельных запроса возвращают 58 и 43 записи, что в сумме составляет 101 запись. Это различие происходит из-за того, что две записи не уникальны. В статье Работа с различными записями в запросах на объединение с помощью функции UNION ALL рассказывается о том, как решить этот сценарий с помощью UNION ALL.
Добавление итогов в запрос на объединение
Запрос на объединение специально предназначен для объединения набора записей с одной записью, содержащей сумму одного или нескольких полей.
Рассмотрим на примере базы данных "Борей", как получить итоговое значение в запросе на объединение.
Создайте простой запрос, который выводит закупки пива (ИД товара = 34 в базе данных "Борей"), используя следующий синтаксис SQL:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];В режиме таблицы вы увидите четыре записи:
Дата получения Количество 22.01.2006 100 22.01.2006 60 04.04.2006 50 05.04.2006 300 Для получения итогового значения создайте простой агрегирующий запрос, добавив следующий код SQL:
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34))В режиме таблицы теперь должна отображаться только одна запись:
Максимум_Дата получения Сумма_Количество 05.04.2006 510 Включите эти два запроса в запрос на объединение, чтобы добавить запись с общим количеством к записям о закупках:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];В режиме таблицы под записями закупок теперь выводится сумма:
Дата получения Количество 22.01.2006 60 22.01.2006 100 04.04.2006 50 05.04.2006 300 05.04.2006 510
Вот и все, что нужно знать о добавлении итогов в запросы на объединение. Кроме того, можно включить фиксированные значения в оба запроса, например "Подробно" и "Итог", чтобы визуально отделить итоговую запись от других записей. Сведения о том, как использовать такие значения, см. в разделе Объединение трех и более таблиц или запросов в запросе.
Работа с уникальными записями в запросах на объединение с помощью UNION ALL
Запросы на объединение в Access по умолчанию включают только уникальные записи. Но что делать, если вы хотите вывести все записи? Рассмотрим еще один пример.
В предыдущем разделе мы показали, как добавить итоговое значение в запрос на объединение. Измените этот запрос на объединение, включив в него SQLProduct ID = 48следующие элементы:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION
SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Purchase Order Details].[Date Received];
В режиме таблицы отобразится странный результат:
| Дата получения | Количество |
|---|---|
| 22.01.2006 | 100 |
| 22.01.2006 | 200 |
Конечно, одна запись не возвращает двойное общее количество.
Вы видите этот результат, потому что в один день одно и то же количество шоколадных конфет было продано дважды, как указано в таблице "Сведения о заказе на покупку". Вот результат простого запроса на выборку, который выводит обе записи из базы данных "Борей":
| ИД заказа на приобретение | Продукт | Количество |
|---|---|---|
| 100 | Шоколад | 100 |
| 92 | Шоколад | 100 |
В запросе на объединение, указанном выше, видно, что поле "Код заказа на покупку" не включено и что эти два поля не образуют две отдельные записи.
Если требуется включить все записи, используйте UNION ALL вместо UNION "в SQL". Это, скорее всего, повлияет на сортировку результатов, поэтому вы также можете включить ORDER BY предложение для определения порядка сортировки. Ниже приведены изменения SQL на основе предыдущего примера.
SELECT [Purchase Order Details].[Date Received], Null As [Total], [Purchase Order Details].Quantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
UNION ALL
SELECT Max([Date Received]), "Total" As [Total], Sum([Quantity]) AS SumOfQuantity
FROM [Purchase Order Details]
WHERE ((([Purchase Order Details].[Product ID])=48))
ORDER BY [Total];
В режиме таблицы теперь выводятся все сведения в дополнение к итоговой записи:
| Дата получения | Итого | Количество |
|---|---|---|
| 22.01.2006 | 100 | |
| 22.01.2006 | 100 | |
| 22.01.2006 | Итого | 200 |
Использование запроса на объединение для фильтрации записей в форме с помощью элемента управления "поле со списком"
Запросы на объединение часто используются в качестве источника записей для элементов управления "поле со списком" в форме. В таких полях со списком можно выбирать значение для фильтрации записей. Например, можно отфильтровать записи сотрудников по городу.
Рассмотрим это на примере базы данных "Борей".
Создайте простой запрос на выборку, используя следующий
SQLсинтаксис:SELECT Employees.City, Employees.City AS Filter FROM Employees;В режиме таблицы должны появиться следующие результаты:
Город Фильтр Псков Псков Томск Томск Самара Самара Сочи Сочи Псков Псков Самара Самара Псков Псков Самара Самара Псков Псков На первый взгляд кажется, что это ничего не дает. Однако разверните запрос и преобразуйте его в запрос на объединение с помощью следующих
SQLкоманд:SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;В режиме таблицы должны появиться следующие результаты:
Город Фильтр <Все> * Томск Томск Сочи Сочи Самара Самара Псков Псков Access объединяет девять ранее показанных записей с фиксированными значениями <полей "Все> " и "*". Поскольку это предложение объединения не содержит
UNION ALL, Access возвращает только отдельные записи. Это означает, что каждый город возвращается только один раз с фиксированными идентичными значениями.Теперь полученный запрос, в котором есть все уникальные названия городов, а также вариант, выбирающий все города, можно использовать как источник записей для поля со списком в форме. В этом примере можно создать поле со списком в форме, задать запрос в качестве его источника записей, указать для ширины столбца "Фильтр" значение 0 (нуль), чтобы скрыть его, а затем установить для свойства "Связанный столбец" значение 1, чтобы указать индекс второго столбца.
FilterЗатем в свойство самой формы можно добавить код, например приведенный ниже, чтобы активировать фильтр формы с помощью значения, выбранного в элементе управления "поле со списком":Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueПользователь формы может затем отфильтровать записи формы по определенному названию города или выбрать <"Все> ", чтобы получить список всех записей для всех городов.