Иногда может потребоваться добавить записи из нескольких таблиц или запросов в один список. Для этого в Access можно использовать запрос на объединение.
Чтобы хорошо понимать запросы на объединение, нужно уметь создавать базовые запросы на выборку в Access. Подробнее о них читайте в статье Создание простого запроса на выборку.
Пример запроса на объединение
Если вы никогда не создавали запросов на объединение, начните с изучения рабочего примера в шаблоне "Борей" Access. Вы можете найти ее на начальной странице Access, выбрав Файл > Создать, или скачать с этого сайта.
Когда Access откроет базу данных Northwind, закройте появиющуюся форму диалогового окна входа, а затем разверните область навигации. Щелкните верхнюю часть области навигации и выберите Тип объекта , чтобы упорядочить все объекты базы данных по их типу. Затем разверните группу Запросы , и вы увидите запрос с именем "Транзакции продукта".
Запросы на объединение легко отличить от других объектов запросов, так как они помечены специальным значком, который напоминает два пересекающихся круга (он символизирует объединение двух множеств):
В отличие от обычных запросов на выборку и изменение, в запросе на объединение таблицы не связаны, то есть для их создания и изменения нельзя использовать графический конструктор запросов Access. Вы увидите это, если откроете запрос на объединение из области навигации: результаты отобразятся в режиме таблицы. В группе Режимы на вкладке Главная не будет доступен пункт Конструктор. Вы сможете переключаться только между режимом таблицы и режимом SQL.
Чтобы продолжить изучение этого примера запроса объединения, щелкните Главная > Представления > представление SQL , чтобы просмотреть синтаксис SQL, который его определяет. На этом рисунке мы добавили некоторые дополнительные интервалы в SQL, чтобы вы могли легко видеть различные части, составляющие запрос на объединение.
Изучим синтаксис SQL этого запроса на объединение из базы данных "Борей" подробнее:
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 по сути являются запросами на выборку. Эти запросы получают два разных набора записей: из таблицы Заказы на товары и из таблицы Закупки товаров.
Вторая часть инструкции — ключевое слово UNION, которое указывает, что запрос будет объединять эти два набора записей.
Последняя часть с инструкцией ORDER BY определяет порядок объединенных записей. В этом примере все записи будут упорядочены по полю "Дата размещения" в порядке убывания.
Примечание: Запросы на объединение всегда доступны только для чтения; вы не сможете изменить никакие значения в режиме таблицы.
Создание запроса на объединение путем объединения запросов на выборку
Хотя запрос на объединение можно написать непосредственно в режиме SQL, гораздо удобнее создавать его по частям, используя запросы на выборку. Затем можно скопировать части кода SQL и вставить их в общий запрос на объединение.
Вы можете пропустить эти инструкции и просмотреть видео с примером в следующем разделе (Пример создания запроса на объединение).
-
На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
-
Дважды щелкните таблицу с полями, которые нужно включить. Таблица будет добавлена в окно конструктора запросов.
-
В окне конструктора запросов дважды щелкните поля, которые нужно включить. При выборе полей убедитесь, что добавляется такое же число полей и в таком же порядке, как при добавлении в другие запросы на выборку. Уделите особое внимание типам данных полей, и убедитесь, что они совместимы с типами данных полей в таких же положениях в других объединяемых запросах. Например, если сначала был выбран запрос с пятью полями, первое из которых содержит дату и время, убедитесь, чтобы в других объединяемых запросах на выборку также было по пять полей, первое из которых содержит дату и время, и т. д.
-
Дополнительно к полям можно добавить условия, введя соответствующие выражения в строке "Условия" сетки полей.
-
После добавления полей и их условий выполните запрос на выборку и проверьте его выходные данные. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
-
Переключите запрос в конструктор.
-
Сохраните запрос на выборку и не закрывайте его.
-
Повторите эту процедуру для всех запросов на выборку, которые необходимо объединить.
Теперь следует объединить созданные запросы на выборку. На этом этапе нужно создать запрос на объединение, скопировав и вставив инструкции SQL.
-
На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
-
На вкладке Конструктор в группе Тип запроса щелкните Объединение. Access скроет окно конструктора запросов и отобразит вкладку объекта в режиме SQL. На данном этапе эта вкладка будет пуста.
-
Щелкните вкладку первого запроса на выборку, который вы хотите добавить в запрос на объединение.
-
На вкладке Главная нажмите кнопку Режими выберите Режим SQL.
-
Скопируйте инструкцию SQL для запроса на выборку. Щелкните вкладку запроса на объединение, который вы начали создавать ранее.
-
Вставьте инструкцию SQL для запроса на выборку на вкладку объекта в режиме SQL.
-
Удалите точку с запятой (;) в конце инструкции SQL для запроса на выборку.
-
Нажмите клавишу ВВОД, чтобы переместить курсор на строку ниже, и введите в новой строке слово UNION.
-
Щелкните вкладку следующего запроса на выборку, который необходимо добавить в запрос на объединение.
-
Повторите действия 5—10, пока не будут скопированы и вставлены все инструкции SQL для запросов на выборку в окне режима SQL запроса на объединение. Не удаляйте точку с запятой и не вводите ничего после инструкции SQL в последнем запросе на выборку.
-
На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Результаты запроса на объединение отобразятся в режиме таблицы.
Пример создания запроса на объединение
В этом разделе приведен пример, который вы можете воссоздать в базе данных "Борей". Этот запрос на объединение собирает имена людей из таблицы 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 из других объектов запросов. Каждый запрос может быть гораздо сложнее, чем простые примеры выборки запросов, используемые здесь. В ваших интересах можно тщательно создавать и тестировать каждый запрос, прежде чем объединять их в запросе объединения. Если запрос объединения не выполняется, можно настроить каждый запрос по отдельности, пока он не будет успешным, а затем перестроить запрос объединения с исправленным синтаксисом.
В оставшихся разделах этой статьи вы найдете дополнительные советы и рекомендации по использованию запросов на объединение.
В предыдущем примере мы объединили данные только из двух таблиц базы данных "Борей". Однако в запрос на объединение очень легко добавить больше таблиц. Например, в результаты приведенного выше запроса может также потребоваться включить имена сотрудников. Для этого добавьте третий запрос и объедините его с существующей инструкцией 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];
В запросе на объединение порядок записей разрешено задавать только один раз, но каждый запрос можно отфильтровать по отдельности. В этом примере мы отфильтровали каждый запрос, добавив предложение 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 |
Предположим, что вы хотите разделить поле "Количество" на два — для закупок и продаж. Также допустим, что вместо пустых полей вы хотите использовать статическое значение 0. Вот какой код 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 извлекает значения Buy, но преобразует их в текст. Вы можете определить, что это текстовые значения, так как они выровнены по левому краю в представлении таблицы. Пустая строка в первом запросе не является числом, поэтому эти результаты отображаются. Вы также заметите, что значения Продажи также преобразуются в текст, так как записи покупки содержат пустую строку.
ИД товара |
Дата размещения |
Название |
Операция |
Закупка |
Продажа |
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
Этот фрагмент будет всегда иметь значение 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;
Примечание: Объединенный запрос, показанный в этом примере, возвращает из базы данных "Борей" 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
Вот и все, что нужно знать о добавлении итогов в запросы на объединение. Вам также может потребоваться включить статические значения в оба запроса, например "Подробности" и "Итоги", чтобы визуально отделить обычные записи от итоговой. Сведения о том, как использовать такие значения, см. в разделе Объединение трех и более таблиц или запросов в запросе.
Запросы на объединение в Access по умолчанию включают только уникальные записи. Но что делать, если вы хотите вывести все записи? Рассмотрим еще один пример.
В предыдущем разделе мы показали, как добавить итоговое значение в запрос на объединение. Измените ИД товара в нем на 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. Скорее всего, это повлияет на сортировку результатов, поэтому советуем также добавить предложение 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, чтобы указать индекс второго столбца. После этого в свойство "Фильтр" самой формы можно добавить следующий код, чтобы активировать фильтр формы с учетом значения, выбранного в поле со списком:
Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = True
Благодаря этому пользователь формы сможет фильтровать записи, выбирая конкретный город или значение <Все>.