Просмотр результатов нескольких запросов с помощью запроса на объединение

Просмотр результатов нескольких запросов с помощью запроса на объединение

Иногда может потребоваться добавить записи из нескольких таблиц или запросов в один список. Для этого в Access можно использовать запрос на объединение.

Чтобы хорошо понимать запросы на объединение, нужно уметь создавать базовые запросы на выборку в Access. Подробнее о них читайте в статье Создание простого запроса на выборку.

Примечание: Эта статья относится только к классическим базам данных Access. В веб-базах данных и веб-приложениях Access нельзя создавать или использовать запросы на объединение.

Пример запроса на объединение

Если вы никогда не создавали запросов на объединение, начните с изучения рабочего примера в шаблоне "Борей" Access. Вы можете найти ее на начальной странице Access, выбрав Файл > Создать, или скачать с этого сайта.

Открыв базу данных "Борей" в Access, закройте диалоговое окно входа, а затем разверните область навигации. Щелкните значок в ее верхней части и выберите Тип объекта, чтобы упорядочить все объекты базы данных по их типу. Затем разверните группу Запросы. Вы увидите запрос Операции с товарами.

Запросы на объединение легко отличить от других объектов запросов, так как они помечены специальным значком, который напоминает два пересекающихся круга (он символизирует объединение двух множеств):

Снимок экрана: значок запроса на объединение в Access.

В отличие от обычных запросов на выборку и изменение, в запросе на объединение таблицы не связаны, то есть для их создания и изменения нельзя использовать графический конструктор запросов Access. Вы увидите это, если откроете запрос на объединение из области навигации: результаты отобразятся в режиме таблицы. В группе Режимы на вкладке Главная не будет доступен пункт Конструктор. Вы сможете переключаться только между режимом таблицы и режимом SQL.

Продолжим изучение примера. Выберем Главная > Режимы > Режим SQL, чтобы просмотреть синтаксис SQL, который определяет запрос на объединение. На этом рисунке мы добавили в него пробелы, чтобы выделить части запроса.

Браузер не поддерживает видео. Установите Microsoft Silverlight, Adobe Flash Player или Internet Explorer 9.

Изучим синтаксис 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 и вставить их в общий запрос на объединение.

Вы можете пропустить эти инструкции и просмотреть видео с примером в следующем разделе (Пример создания запроса на объединение).

  1. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.

  2. В диалоговом окне Добавление таблицы дважды щелкните таблицу, поля которой нужно включить. Таблица будет добавлена в окно конструктора запросов.

  3. Закройте диалоговое окно Добавление таблицы.

  4. В окне конструктора запросов дважды щелкните поля, которые нужно включить. При выборе полей убедитесь, что добавляется такое же число полей и в таком же порядке, как при добавлении в другие запросы на выборку. Уделите особое внимание типам данных полей, и убедитесь, что они совместимы с типами данных полей в таких же положениях в других объединяемых запросах. Например, если сначала был выбран запрос с пятью полями, первое из которых содержит дату и время, убедитесь, чтобы в других объединяемых запросах на выборку также было по пять полей, первое из которых содержит дату и время, и т. д.

  5. Дополнительно к полям можно добавить условия, введя соответствующие выражения в строке "Условия" сетки полей.

  6. После добавления полей и их условий выполните запрос на выборку и проверьте его выходные данные. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

  7. Переключите запрос в конструктор.

  8. Сохраните запрос на выборку и не закрывайте его.

  9. Повторите эту процедуру для всех запросов на выборку, которые необходимо объединить.

Теперь следует объединить созданные запросы на выборку. На этом этапе нужно создать запрос на объединение, скопировав и вставив инструкции SQL.

  1. На вкладке Создание в группе Запросы нажмите кнопку Конструктор запросов.

  2. Закройте диалоговое окно Добавление таблицы.

  3. На вкладке Конструктор в группе Тип запроса щелкните Объединение. Access скроет окно конструктора запросов и отобразит вкладку объекта в режиме SQL. На данном этапе эта вкладка будет пуста.

  4. Щелкните вкладку первого запроса на выборку, который вы хотите добавить в запрос на объединение.

  5. На вкладке Главная нажмите кнопку Режими выберите Режим SQL.

  6. Скопируйте инструкцию SQL для запроса на выборку. Щелкните вкладку запроса на объединение, который вы начали создавать ранее.

  7. Вставьте инструкцию SQL для запроса на выборку на вкладку объекта в режиме SQL.

  8. Удалите точку с запятой (;) в конце инструкции SQL для запроса на выборку.

  9. Нажмите клавишу ВВОД, чтобы переместить курсор на строку ниже, и введите в новой строке слово UNION.

  10. Щелкните вкладку следующего запроса на выборку, который необходимо добавить в запрос на объединение.

  11. Повторите действия 5—10, пока не будут скопированы и вставлены все инструкции SQL для запросов на выборку в окне режима SQL запроса на объединение. Не удаляйте точку с запятой и не вводите ничего после инструкции SQL в последнем запросе на выборку.

  12. На вкладке Конструктор в группе Результаты нажмите кнопку Выполнить.

Результаты запроса на объединение отобразятся в режиме таблицы.

Пример создания запроса на объединение

В этом разделе приведен пример, который вы можете воссоздать в базе данных "Борей". Этот запрос на объединение собирает имена людей из таблицы Customers и объединяет их с именами из таблицы Поставщики. Чтобы изучить пример, выполняйте эти инструкции в своей копии базы данных "Борей".

Браузер не поддерживает видео. Установите Microsoft Silverlight, Adobe Flash Player или Internet Explorer 9.

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

  1. Создайте два запроса на выборку ("Запрос1" и "Запрос2"), указав в качестве источников их данных таблицы Customers и "Поставщики" соответственно. В качестве отображаемых значений используйте поля "Имя" и "Фамилия".

  2. Создайте запрос ("Запрос3"), в котором изначально нет источника данных, и нажмите кнопку Объединение на вкладке Конструктор, чтобы сделать его запросом на объединение.

  3. Скопируйте инструкции SQL из запросов "Запрос1" и "Запрос2" и вставьте их в "Запрос 3". Не забудьте удалить лишнюю точку с запятой и добавить ключевое слово UNION. Вы можете проверить результаты в режиме таблицы.

  4. Добавьте в один из запросов предложение, определяющее порядок записей, а затем вставьте инструкцию ORDER BY в запросе на объединение в режиме SQL. Обратите внимание на то, что при добавлении инструкции ORDER BY в "Запрос3" сначала удаляются точки с запятой, а затем названия таблиц из имен полей.

  5. Окончательный код 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 не является числом.

Что произойдет, если вставить вместо 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 извлекает значения для столбца "Закупка", но преобразует их в текст (это можно определить по тому, что они выровнены по левому краю). Пустая строка в первом запросе не является числом, поэтому результаты выводятся таким образом. Кроме того, значения "Продажа" также преобразуются в текст, так как записи покупок содержат пустую строку.

ИД товара

Дата размещения

Название

Операция

Закупка

Продажа

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.

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

Рассмотрим на примере базы данных "Борей", как получить итоговое значение в запросе на объединение.

  1. Создайте простой запрос, который выводит закупки пива (ИД товара = 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];
  2. В режиме таблицы вы увидите четыре записи:

    Дата получения

    Количество

    22.01.2006

    100

    22.01.2006

    60

    04.04.2006

    50

    05.04.2006

    300

  3. Для получения итогового значения создайте простой агрегирующий запрос, добавив следующий код SQL:

    SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity
    FROM [Purchase Order Details]
    WHERE ((([Purchase Order Details].[Product ID])=34))
  4. В режиме таблицы теперь должна отображаться только одна запись:

    Максимум_Дата получения

    Сумма_Количество

    05.04.2006

    510

  5. Включите эти два запроса в запрос на объединение, чтобы добавить запись с общим количеством к записям о закупках:

    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];
  6. В режиме таблицы под записями закупок теперь выводится сумма:

    Дата получения

    Количество

    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

Запросы на объединение часто используются в качестве источника записей для элементов управления "поле со списком" в форме. В таких полях со списком можно выбирать значение для фильтрации записей. Например, можно отфильтровать записи сотрудников по городу.

Рассмотрим это на примере базы данных "Борей".

  1. Создайте простой запрос на выборку, используя следующий синтаксис SQL:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. В режиме таблицы должны отображаться следующие результаты:

    Город

    Фильтр

    Псков

    Псков

    Томск

    Томск

    Самара

    Самара

    Сочи

    Сочи

    Псков

    Псков

    Самара

    Самара

    Псков

    Псков

    Самара

    Самара

    Псков

    Псков

  3. На первый взгляд кажется, что это ничего не дает. Но попробуйте расширить запрос и преобразовать его в запрос на объединение, используя следующий код SQL:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. В режиме таблицы должны появиться следующие результаты:

    Город

    Фильтр

    <Все>

    *

    Томск

    Томск

    Сочи

    Сочи

    Самара

    Самара

    Псков

    Псков

    Access объединяет указанные выше девять записей со статическими значениями полей <Все> и "*".

    Так как это предложение не содержит UNION ALL, Access возвращает только уникальные записи, то есть каждый город выводится только один раз.

  5. Теперь полученный запрос, в котором есть все уникальные названия городов, а также вариант, выбирающий все города, можно использовать как источник записей для поля со списком в форме. В этом примере можно создать поле со списком в форме, задать запрос в качестве его источника записей, указать для ширины столбца "Фильтр" значение 0 (нуль), чтобы скрыть его, а затем установить для свойства "Связанный столбец" значение 1, чтобы указать индекс второго столбца. После этого в свойство "Фильтр" самой формы можно добавить следующий код, чтобы активировать фильтр формы с учетом значения, выбранного в поле со списком:

    Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'"
    Me.FilterOn = True

    Благодаря этому пользователь формы сможет фильтровать записи, выбирая конкретный город или значение <Все>.

К началу страницы

Совершенствование навыков работы с Office
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединиться к программе предварительной оценки Office

Были ли сведения полезными?

Спасибо за ваш отзыв!

Благодарим за отзыв! Возможно, будет полезно связать вас с одним из наших специалистов службы поддержки Office.

×