Об’єднання результатів кількох запитів за допомогою запиту на об’єднання

Об’єднання результатів кількох запитів за допомогою запиту на об’єднання

Ви можете об’єднати записи з однієї таблиці або запиту із записами з кількох інших таблиць, щоб створити один набір записів – список з усіма записами з однієї або двох таблиць. Зробити це можна за допомогою запиту на об’єднання в Access.

Щоб повністю опанувати роботу із запитами на об’єднання, спочатку слід навчитися створювати прості вибіркові запити в Access. Щоб дізнатися більше про створення вибіркових запитів, див. статтю Створення простого вибіркового запиту.

Примітка.: Вміст цієї статті стосується настільних баз Access. Створювати або використовувати запити на об’єднання у веб-базі даних Access або веб-програмі Access не можна.

Вивчення зразка робочого запиту на об’єднання

Якщо вам ще не доводилося створювати запит на об’єднання, імовірно, може знадобитися спочатку розглянути робочий зразок на основі шаблону Northwind в Access. Знайти цей шаблон можна на сторінці початку роботи з Access, вибравши Файл > Створити. Або ж ви можете завантажити його за цим посиланням: Зразок шаблону Northwind.

Коли в Access відкриється база даних, пропустіть діалогове вікно входу, що з’явиться, а потім розгорніть область переходів. Клацніть угорі області переходів і виберіть Тип об’єкта, щоб упорядкувати всі об’єкти бази даних за типом. Потім розгорніть групу Запити та знайдіть у списку запит Транзакції товару.

Запити на об’єднання легко відрізнити від інших об’єктів запиту за спеціальною піктограмою, яка нагадує два кола, що перетинаються, символізуючи об’єднання двох наборів даних.

Знімок екрана: піктограма запиту на об’єднання в Access.

На відміну від звичайних вибіркових запитів і запитів на змінення, таблиці в запиті на об’єднання не пов’язано між собою. Це означає, що створювати й редагувати запити на об’єднання за допомогою графічного дизайнера запитів Access не можна. Ви переконаєтеся в цьому, коли відкриєте запит на об’єднання з області переходів: Access відобразить результати у вікні табличного подання даних. Ви помітите, що під час роботи із запитами на об’єднання на вкладці Основне в групі Подання відсутній параметр Конструктор. Вибрати можна тільки Подання таблиці або Режим SQL.

Щоб продовжити роботу з цим запитом на об’єднання, виберіть Основне > Подання > Режим SQL, щоб переглянути синтаксис SQL, що визначає його. У цьому відео ми додали в режимі SQL кілька зайвих пробілів, щоб ви зауважили, з яких частин складається запит на об’єднання.

Ваш браузер не підтримує відео. Інсталюйте Microsoft Silverlight, Adobe Flash Player або Internet Explorer 9.

Розгляньмо докладніше синтаксис 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 упорядкує всі записи за спаданням значень у стовпці "Дата замовлення".

Примітка.: Запити на об’єднання завжди доступні в Access тільки для читання. Змінити будь-які їхні значення в поданні таблиці не вдасться.

Створення запиту на об’єднання створенням й об’єднанням вибіркових запитів

Хоча ви можете створити запит на об’єднання, просто написавши синтаксис SQL у режимі SQL, зробити це за допомогою кількох вибіркових запитів може бути простіше. Потім ви зможете скопіювати та вставити частини інструкції SQL в єдиний запит на об’єднання.

Щоб пропустити вказівки й натомість переглянути відеозразок, перейдіть до наступного розділу Приклад створення запиту на об’єднання.

  1. На вкладці Створити у групі Запити натисніть кнопку Макет запиту.

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

  3. Закрийте діалогове вікно Відображення таблиці.

  4. У вікні макета запиту двічі клацніть кожне поле, яке потрібно додати. Вибираючи поля, слідкуйте за тим, щоб кількість і порядок доданих полів були такими самими, як і в інших вибіркових запитах. Уважно слідкуйте за типами даних полів: переконайтеся, що вони сумісні з типами даних полів, які мають такий самий порядковий номер в інших запитах, які ви поєднуєте. Наприклад, перший вибірковий запит має п’ять полів, перше з яких містить дані про дату або час. У такому разі всі інші вибіркові запити, що ви поєднуєте, також повинні мати по п’ять полів, у першому з яких мають міститися дані про дату або час.

  5. За потреби до полів можна додати умови, ввівши в сітці полів у рядку "Критерії" відповідні вирази.

  6. Додавши поля й умови полів, виконайте вибірковий запит і перегляньте його результати. На вкладці Конструктор у групі Результати клацніть команду Запустити.

  7. Відкрийте запит у режимі конструктора.

  8. Збережіть його та залиште відкритим.

  9. Повторіть ці дії для всіх вибіркових запитів, які потрібно поєднати.

Тепер, створивши вибіркові запити, ви можете об’єднати їх. На цьому етапі ми створимо запит на об’єднання, створивши та вставивши інструкції SQL.

  1. На вкладці Створити у групі Запити натисніть кнопку Макет запиту.

  2. Закрийте діалогове вікно Відображення таблиці.

  3. На вкладці Конструктор у групі Тип запиту натисніть кнопку Об’єднання. Access приховає вікно макета запиту й відобразить вкладку об’єкта в режимі SQL. На цьому етапі вона буде пуста.

  4. Виберіть вкладку першого вибіркового запису, який потрібно додати до запиту на об’єднання.

  5. На вкладці Основне натисніть кнопку Вигляд> Режим SQL.

  6. Скопіюйте інструкцію SQL для вибіркового запиту. Перейдіть на вкладку запиту на об’єднання, який ви почали створювати на кроці 1.

  7. Вставте скопійовану SQL-інструкцію в запит на об’єднання (вкладка об’єкта в режимі SQL).

  8. Видаліть крапку з комою (;) у кінці SQL-інструкції вибіркового запиту.

  9. Натисніть клавішу Enter, щоб перемістити курсор на один рядок униз, і в новому рядку введіть слово UNION.

  10. Виберіть вкладку наступного вибіркового запиту, який потрібно додати до запиту на об’єднання.

  11. Повторіть кроки 5–10, доки не вставите всі SQL-інструкції вибіркових запитів у запит на об’єднання (вікно в режимі SQL). В останньому вибірковому запиті не видаляйте крапку з комою та не вводьте жодні додаткові символи після SQL-інструкції.

  12. На вкладці Конструктор у групі Результати натисніть кнопку Запуск.

Результати запиту на об’єднання відкриються у вікні табличного подання даних.

Приклад створення запиту на об’єднання

Нижче наведено приклад, який можна відтворити в зразку бази даних Northwind. Цей запит на об’єднання збирає імена людей із таблиці Клієнти і об’єднує їх з іменами з таблиці Постачальники. Щоб дізнатися більше про це, виконайте запропоновані кроки у своєму екземплярі зразка бази даних Northwind.

Ваш браузер не підтримує відео. Інсталюйте Microsoft Silverlight, Adobe Flash Player або Internet Explorer 9.

Необхідні дії для відтворення цього зразка:

  1. Створіть два вибіркові запити "Запит1" і "Запит2", вибравши таблиці "Клієнти" й "Постачальники" відповідно як джерела даних. Виберіть поля "Прізвище" та "Ім’я" як відображувані значення.

  2. Створіть ще один запит "Запит3", поки не вказуючи джерело даних, а потім натисніть кнопку Об’єднання на вкладці Конструктор, щоб перетворити цей запит на запит на об’єднання.

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

  4. Додайте речення сортування до одного із запитів, а потім вставте інструкцію ORDER BY у режимі SQL запиту на об’єднання. Зверніть увагу: у запиті на об’єднання (вкладка "Запит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 з інших об’єктів запиту може видатися простішим. Кожен окремий запит може бути значно складніший, ніж простий вибірковий запит, зразки якого ми навели в цій статті. Радимо створити й уважно перевірити кожен запит, перш ніж використовувати їх у запиті на об’єднання. Якщо запит на об’єднання не запускається, ви можете налаштувати кожен запит окремо, а потім перебудувати запит на об’єднання з правильним синтаксисом.

Перегляньте решту розділів цієї статті, щоб отримати інші поради й підказки з використання запитів на об’єднання.

У прикладі з попереднього розділу ми об’єднали тільки дані з двох таблиць бази даних 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 відображає п’ять зразків записів:

Зайнятість

Прізвище

Ім’я

Штатний

Freehafer

Nancy

Штатний

Giussani

Laura

Постачальник

Glasson

Stuart

Клієнт

Goldschmidt

Daniel

Клієнт

Gratacos Solsona

Antonio

Наведений вище запит можна навіть більше скоротити, оскільки 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];

Перейдіть у вікно табличного подання даних, і результати відобразяться в такому вигляді:

Зайнятість

Прізвище

Ім’я

Постачальник

Andersen

Elizabeth A.

Штатний

Freehafer

Nancy

Клієнт

Hasselberg

Jonas

Штатний

Hellung-Larsen

Anne

Постачальник

Hernandez-Echevarria

Amaya

Клієнт

Mortensen

Sven

Постачальник

Sandberg

Mikael

Постачальник

Марченко

Леонід

Штатний

Thorpe

Steven

Постачальник

Weiler

Cornelia

Штатний

Zare

Robert

Якщо запити, які потрібно об’єднати, відрізняються між собою, може виникнути ситуація, коли поле виводу має містити дані різних типів. У такому разі запит на об’єднання найчастіше повертатиме результат у вигляді текстових даних, оскільки цей тип даних може включати як текст, так і числа.

Щоб зрозуміти, як це працює, ми скористаємося запитом на об’єднання Транзакції товару в зразку бази даних Northwind. Відкрийте зразок бази даних, а потім відкрийте запит "Транзакції товару" у вікні табличного подання даних. Ось зразок останніх десяти записів:

Ідентифікатор товару

Дата замовлення

Назва компанії

Транзакція

Кількість

77

22.01.2006

Постачальник B

Придбати

60

80

22.01.2006

Постачальник D

Придбати

75

81

22.01.2006

Постачальник А

Придбати

125

81

22.01.2006

Постачальник А

Придбати

200

7

20.01.2006

Компанія D

Продаж

10

51

20.01.2006

Компанія D

Продаж

10

80

20.01.2006

Компанія D

Продаж

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; 

Якщо перейти у вікно табличного подання даних, останні десять записів відобразяться в такому вигляді:

Ідентифікатор товару

Дата замовлення

Назва компанії

Транзакція

Придбання

Продаж

74

22.01.2006

Постачальник B

Придбати

20

0

77

22.01.2006

Постачальник B

Придбати

60

0

80

22.01.2006

Постачальник D

Придбати

75

0

81

22.01.2006

Постачальник А

Придбати

125

0

81

22.01.2006

Постачальник А

Придбати

200

0

7

20.01.2006

Компанія D

Продаж

0

10

51

20.01.2006

Компанія D

Продаж

0

10

80

20.01.2006

Компанія D

Продаж

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

Постачальник B

Придбати

 

 

77

22.01.2006

Постачальник B

Придбати

 

 

80

22.01.2006

Постачальник D

Придбати

 

 

81

22.01.2006

Постачальник А

Придбати

 

 

81

22.01.2006

Постачальник А

Придбати

 

 

7

20.01.2006

Компанія D

Продаж

 

10

51

20.01.2006

Компанія D

Продаж

 

10

80

20.01.2006

Компанія D

Продаж

 

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 отримує значення стовпця "Придбання", але перетворює їх на текстові. Ці значення можна вважати текстовими, оскільки їх вирівняно за лівим краєм у поданні таблиці. Пустий рядок у першому запиті – це не число, тому ви й бачите такі результати. Крім того, ви помітите, що значення стовпця "Продаж" також перетворилися на текстові, оскільки записи про придбання містять пустий рядок.

Ідентифікатор товару

Дата замовлення

Назва компанії

Транзакція

Придбання

Продаж

74

22.01.2006

Постачальник B

Придбати

20

 

77

22.01.2006

Постачальник B

Придбати

60

 

80

22.01.2006

Постачальник D

Придбати

75

 

81

22.01.2006

Постачальник А

Придбати

125

 

81

22.01.2006

Постачальник А

Придбати

200

 

7

20.01.2006

Компанія D

Продаж

 

10

51

20.01.2006

Компанія D

Продаж

 

10

80

20.01.2006

Компанія D

Продаж

 

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

Постачальник B

Придбати

20

 

77

22.01.2006

Постачальник B

Придбати

60

 

80

22.01.2006

Постачальник D

Придбати

75

 

81

22.01.2006

Постачальник А

Придбати

125

 

81

22.01.2006

Постачальник А

Придбати

200

 

7

20.01.2006

Компанія D

Продаж

 

10

51

20.01.2006

Компанія D

Продаж

 

10

80

20.01.2006

Компанія D

Продаж

 

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, щоб дізнатися, як вирішити цю проблему.

Особливий випадок використання запиту на об’єднання – об’єднання набору записів з одним записом, що містить суму одного або кількох полів.

Нижче наведено інший приклад, який можна відтворити в зразку бази даних Northwind, щоб навчитися підбивати підсумки в запиті на об’єднання.

  1. Створіть простий запит, щоб проаналізувати придбання пива (Ідентифікатор продукту=34 в базі даних Northwind), використовуючи такий синтаксис 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. Перейдіть у вікно табличного подання даних, і ви побачите тільки один запис:

    MaxOfDate Received

    SumOfQuantity

    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 за замовчуванням містять тільки окремі записи. Та чи можна додати всі записи? Розгляньмо черговий приклад.

У попередньому розділі ми показали вам, як створити підсумковий запис у запиті на об’єднання. Змініть цей запит на об’єднання в режимі SQL, щоб додати запис "Ідентифікатор продукту=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

Один запис, звісно, не повертає вдвічі більшу загальну кількість.

Ви бачите такий результат, тому що одного дня одну й ту ж кількість шоколаду було продано двічі, як це зазначено в таблиці "Відомості про замовлення на придбання". Нижче наведено зразок простого вибіркового запиту, що відображає обидва записи в зразку бази даних Northwind:

Ідентифікатор замовлення на закупівлю

Product

Кількість

100

Northwind Traders Chocolate

100

92

Northwind Traders Chocolate

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

Зазвичай запит на об’єднання може слугувати джерелом для елемента керування "поле зі списком" у формі. Ви можете скористатися цим полем зі списком, щоб вибрати значення, за яким потрібно фільтрувати записи форми. Наприклад, можна відфільтрувати записи працівників за містом.

Щоб побачити, як це працює, розгляньмо ще один приклад, який можна відтворити в зразку бази даних Northwind.

  1. Створіть простий вибірковий запис за допомогою цього синтаксису SQL:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees;
  2. Перейдіть у вікно табличного подання даних, і ви побачите такі результати:

    Місто

    Фільтр

    Seattle

    Seattle

    Bellevue

    Bellevue

    Redmond

    Redmond

    Kirkland

    Kirkland

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

    Redmond

    Redmond

    Seattle

    Seattle

  3. Мабуть, ви помітили, що ці результати не надто змістовні. Розгорніть запит і перетворіть його на запит на об’єднання за допомогою такого синтаксису SQL:

    SELECT Employees.City, Employees.City AS Filter
    FROM Employees
    
    UNION
    
    SELECT "<All>", "*" AS Filter
    FROM Employees
    
    ORDER BY City;
  4. Перейдіть у вікно табличного подання даних, і ви побачите такі результати:

    Місто

    Фільтр

    <Усі>

    *

    Bellevue

    Bellevue

    Kirkland

    Kirkland

    Redmond

    Redmond

    Seattle

    Seattle

    Access об’єднує всі дев’ять раніше виведених записів за допомогою фіксованих значень полів <Усі> та "*".

    Оскільки це речення об’єднання не містить ключових слів UNION ALL, Access повертає тільки окремі записи. Це означає, що кожне місто повертається тільки один раз з однаковими фіксованими значеннями.

  5. Виконавши запит на об’єднання, що виводить кожну назву міста тільки один раз і дає змогу швидко вибрати всі міста, ви можете скористатися цим запитом як джерелом записів для поля зі списком у формі. Використовуючи цей особливий зразок як модель, можна створити елемент керування "поле зі списком" у формі, установити цей запит його джерелом записів, установити для властивості "Ширина стовпця" стовпця "Фільтр" значення 0 (нуль), щоб приховати його, а потім установити для властивості "Приєднаний стовпець" значення 1, щоб указати індекс другого стовпця. Для властивості "Фільтр" форми можна додати наведений нижче код, щоб активувати фільтр форми з використанням значення, вибраного в елементі керування "поле зі списком".

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

    Користувач форми може потім відфільтрувати записи форми за певною назвою міста або вибрати <Усі>, щоб відобразити всі записи для всіх міст.

На початок сторінки

Удосконалення навичок роботи з Office
Ознайомтеся з навчальними матеріалами
Отримуйте нові функції раніше за інших
Приєднайтеся до оцінювачів Office

Ця інформація корисна?

Дякуємо за ваш відгук!

Дякуємо за відгук! Схоже, вам може стати в нагоді допомога одного з наших спеціалістів служби підтримки Office, з яким ми вас можемо з’єднати.

×