Иногда может потребоваться объединить записи из одной таблицы или запроса с записями из одной или нескольких других таблиц в один результат. Это то, что делает запрос на объединение в Access.
Чтобы хорошо понимать запросы на объединение, нужно уметь создавать базовые запросы на выборку в Access. Подробнее о них читайте в статье Создание простого запроса на выборку.
Пример запроса на объединение
Если вы никогда ранее не создавали запрос на объединение, это может помочь сначала изучить рабочий пример в шаблоне Northwind Access. Вы можете найти пример шаблона Northwind на странице "Начало работы" в Access, выбрав Создать файл>. Вы также можете скачать копию непосредственно из примера шаблона Northwind.
Когда Access откроет базу данных Northwind, закройте открывающееся диалоговое окно входа, а затем разверните область навигации. Выберите верхнюю часть области навигации, а затем выберите Тип объекта , чтобы упорядочить все объекты базы данных по типу. Затем разверните группу Запросы , и вы увидите запрос с именем "Транзакции продукта".
Запросы на объединение легко отличить от других объектов запросов, так как они помечены специальным значком, который напоминает два пересекающихся круга (он символизирует объединение двух множеств):
В отличие от обычных запросов выбора и действий, таблицы не связаны в запросе объединения. Это означает, что вы не можете использовать конструктор графических запросов Access для создания или изменения запросов объединения. Если вы открываете запрос на объединение из области навигации, access открывает его и отображает результаты в режиме таблицы. Обратите внимание, что в разделе Представления на вкладке Главная представление конструктора недоступно при работе с запросами объединения. Можно переключаться только между режимами таблицы и SQL.
Чтобы продолжить изучение этого примера запроса объединения, щелкнитеПредставление SQL"Домашние>представления">, чтобы просмотреть 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, его проще создать по частям с помощью отдельных запросов. Затем можно скопировать части кода SQL и вставить их в общий запрос на объединение.
Вы можете пропустить эти инструкции и просмотреть видео с примером в следующем разделе (Пример создания запроса на объединение).
- На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
- Дважды щелкните таблицу с полями, которые нужно включить. Таблица будет добавлена в окно конструктора запросов.
- В окне конструктора запросов дважды щелкните поля, которые нужно включить. При выборе полей убедитесь, что добавляется такое же число полей и в таком же порядке, как при добавлении в другие запросы на выборку. Уделите особое внимание типам данных полей, и убедитесь, что они совместимы с типами данных полей в таких же положениях в других объединяемых запросах. Например, если сначала был выбран запрос с пятью полями, первое из которых содержит дату и время, убедитесь, чтобы в других объединяемых запросах на выборку также было по пять полей, первое из которых содержит дату и время, и т. д.
- Дополнительно к полям можно добавить условия, введя соответствующие выражения в строке "Условия" сетки полей.
- После добавления полей и их условий выполните запрос на выборку и проверьте его выходные данные. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
- Переключите запрос в конструктор.
- Сохраните запрос на выборку и не закрывайте его.
- Повторите эту процедуру для всех запросов на выборку, которые необходимо объединить.
Теперь, когда вы создали выбранные запросы, пора объединить их. На этом шаге вы создадите запрос на объединение, скопировав и вставив инструкции SQL .
- На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.
- На вкладке Конструктор в группе Тип запроса щелкните Объединение. Access скрывает окно конструктора запроса и отображает вкладку Представление объекта SQL . На этом этапе вкладка пуста.
- Щелкните вкладку первого запроса на выборку, который вы хотите добавить в запрос на объединение.
- На вкладке Главная щелкните Просмотреть>представление SQL.
- Скопируйте инструкцию
SQLдля запроса select. Щелкните вкладку запроса на объединение, который вы начали создавать ранее. - Вставьте инструкцию
SQLдля запроса select на вкладку Sql View object (Представление SQL) запроса на объединение. - Удалите точку с запятой (
;) в конце инструкции select querySQL. - Нажмите клавишу ВВОД, чтобы переместить курсор вниз на одну строку, а затем введите
UNIONновую строку. - Щелкните вкладку следующего запроса на выборку, который необходимо добавить в запрос на объединение.
- Повторяйте шаги 5–10, пока не будут скопированы и вставлены все инструкции
SQLдля запросов select в окно Представление SQL запроса объединения. Не удаляйте точку с запятой и не введите что-либо после инструкцииSQLдля последнего запроса выбора. - На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.
Результаты запроса на объединение отобразятся в режиме таблицы.
Пример создания запроса на объединение
Ниже приведен пример, который можно воссоздать в образце базы данных 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 |
Предположим, что вы хотите разделить поле Количество на два поля: Купить и Продать. Предположим также, что требуется фиксированное нулевое значение для поля без значения. Вот как 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;
Примечание
В этом примере объединенный запрос в базе данных 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
Вот и все, что нужно знать о добавлении итогов в запросы на объединение. Вы также можете включить фиксированные значения в оба запроса, такие как "Detail" и "Total", чтобы визуально отделить общую запись от других записей. Сведения о том, как использовать такие значения, см. в разделе Объединение трех и более таблиц или запросов в запросе.
Работа с уникальными записями в запросах на объединение с помощью UNION ALL
Запросы на объединение в Access по умолчанию включают только уникальные записи. Но что делать, если вы хотите вывести все записи? Рассмотрим еще один пример.
В предыдущем разделе мы показали, как добавить итоговое значение в запрос на объединение. Измените этот запрос SQL объединения, включив в него Product 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;В режиме таблицы должны появиться следующие результаты:
Город Фильтр Псков Псков Томск Томск Самара Самара Сочи Сочи Псков Псков Самара Самара Псков Псков Самара Самара Псков Псков На первый взгляд кажется, что это ничего не дает. Однако разверните запрос и превратите его в запрос объединения с помощью следующего:
SQLSELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;В режиме таблицы должны появиться следующие результаты:
Город Фильтр <Все> * Томск Томск Сочи Сочи Самара Самара Псков Псков Access выполняет объединение девяти записей, показанных ранее, с фиксированными значениями <полей All> и "*". Так как это предложение объединения не содержит
UNION ALL, Access возвращает только отдельные записи. Это означает, что каждый город возвращается только один раз с фиксированными одинаковыми значениями.Теперь полученный запрос, в котором есть все уникальные названия городов, а также вариант, выбирающий все города, можно использовать как источник записей для поля со списком в форме. В этом примере можно создать поле со списком в форме, задать запрос в качестве его источника записей, указать для ширины столбца "Фильтр" значение 0 (нуль), чтобы скрыть его, а затем установить для свойства "Связанный столбец" значение 1, чтобы указать индекс второго столбца. Затем в
Filterсвойство самой формы можно добавить следующий код, чтобы активировать фильтр формы с помощью значения, выбранного в элементе управления поле со списком:Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueПользователь формы может отфильтровать записи формы по названию определенного города или выбрать <Все> , чтобы вывести список всех записей для всех городов.