Іноді потрібно об'єднати записи з однієї таблиці або запиту із записами з кількох інших таблиць в один результат. Саме це робить запит на об'єднання у програмі Access.
Щоб повністю опанувати роботу із запитами на об'єднання, спочатку слід навчитися створювати прості вибіркові запити в Access. Докладні відомості про створення вибіркових запитів див. в статті "Створення простого вибіркового запиту".
Вивчення зразка робочого запиту на об’єднання
Якщо вам ще не доводилося створювати запит на об'єднання, рекомендовано спочатку розглянути робочий зразок на основі шаблону Northwind в Access. Щоб знайти шаблон "Борей", на сторінці початку роботи в Access, виберіть елемент "Створити файл>". Крім того, ви можете завантажити копію безпосередньо зі зразка шаблону Northwind.
Коли в Access відкриється база даних, закрийте діалогове вікно входу, що з'явиться, а потім розгорніть область переходів. Клацніть угорі області переходів, а потім виберіть " Тип об'єкта ", щоб упорядкувати всі об'єкти бази даних за типом. Потім розгорніть групу "Запити " та знайдіть у списку запит " Транзакції товару".
Запити на об’єднання легко відрізнити від інших об’єктів запиту за спеціальною піктограмою, яка нагадує два кола, що перетинаються, символізуючи об’єднання двох наборів даних.
На відміну від звичайних вибіркових запитів і запитів на змінення, у запиті на об'єднання таблиці не пов'язано між собою. Це означає, що створювати та редагувати запити на об'єднання за допомогою графічного конструктора запитів 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 упорядковує всі записи за спаданням значень у стовпці "Дата замовлення".
Примітка.
Запити на об’єднання завжди доступні в Access тільки для читання. Змінити будь-які їхні значення в поданні таблиці не вдасться.
Створення запиту на об’єднання створенням й об’єднанням вибіркових запитів
Хоча ви можете створити запит на об'єднання, написавши SQL синтаксис безпосередньо в режимі SQL, зробити це за допомогою кількох вибіркових запитів може бути простіше. Потім ви зможете скопіювати та вставити частини інструкції SQL в єдиний запит на об’єднання.
Щоб пропустити вказівки й натомість переглянути відеозразок, перейдіть до наступного розділу Приклад створення запиту на об’єднання.
- На вкладці Створити у групі Запити натисніть кнопку Макет запиту.
- Двічі клацніть таблицю з полями, які потрібно включити. Таблиця додасться до вікна макета запиту.
- У вікні макета запиту двічі клацніть кожне поле, яке потрібно додати. Вибираючи поля, переконайтеся, що додано таку ж кількість полів у тій самій послідовності, у якій додаєте до інших вибіркових запитів. Зверніть увагу на типи даних полів і переконайтеся, що вони мають сумісні типи даних із полями, які розташовано в тих самих розташуваннях в інших запитах, які поєднуються. Наприклад, якщо перший вибірковий запит містить п'ять полів, перше з яких містить дані типу "Дата й час", переконайтеся, що кожний з інших вибіркових запитів, які поєднуються, також має п'ять полів, перше з яких містить дані про дату й час тощо.
- За потреби до полів можна додати умови, ввівши в сітці полів у рядку "Критерії" відповідні вирази.
- Додавши поля й умови полів, виконайте вибірковий запит і перегляньте його результати. На вкладці Конструктор у групі Результати клацніть команду Запустити.
- Відкрийте запит у режимі конструктора.
- Збережіть його та залиште відкритим.
- Повторіть ці дії для всіх вибіркових запитів, які потрібно поєднати.
Тепер, створивши вибіркові запити, ви можете об'єднати їх. На цьому етапі ми створимо запит на об'єднання, створивши та вставивши інструкції SQL .
- На вкладці Створити в групі Запити натисніть кнопку Конструктор запитів.
- На вкладці Конструктор у групі Тип запиту натисніть кнопку Об’єднання. Access приховає вікно макета запиту й відобразить вкладку об'єкта в режимі SQL . На цьому етапі вкладка пуста.
- Виберіть вкладку першого вибіркового запису, який потрібно додати до запиту на об’єднання.
- На вкладці "Основне " натисніть кнопку "Переглянути режим>SQL".
- Скопіюйте
SQLінструкцію запиту на вибірку. Перейдіть на вкладку запиту на об’єднання, який ви почали створювати на кроці 1. - Вставте
SQLінструкцію вибіркового запиту на вкладку об'єкта в режимі SQL запиту на об'єднання. - Видаліть крапку з комою (
;) у кінці інструкції вибіркового запитуSQL. - Натисніть клавішу Enter, щоб перемістити курсор на один рядок униз, і введіть текст
UNIONу новому рядку. - Виберіть вкладку наступного вибіркового запиту, який потрібно додати до запиту на об’єднання.
- Повторіть кроки 5–10, доки не вставите всі
SQLінструкції вибіркових запитів у запит на об'єднання (вікно в режимі SQL ). Не видаляйте крапку з комою та не вводьте жодні додаткові символи післяSQLінструкції для останнього вибіркового запиту. - На вкладці Конструктор у групі Результати натисніть кнопку Запуск.
Результати запиту на об’єднання відкриються у вікні табличного подання даних.
Приклад створення запиту на об’єднання
Нижче наведено приклад, який можна відтворити в зразку бази даних Northwind. Цей запит на об’єднання збирає імена людей із таблиці Клієнти і об’єднує їх з іменами з таблиці Постачальники. Щоб дізнатися більше про це, виконайте запропоновані кроки у своєму екземплярі зразка бази даних Northwind.
Необхідні дії для відтворення цього зразка:
Створіть два вибіркові запити "Запит1" і "Запит2", вибравши таблиці "Клієнти" й "Постачальники" відповідно як джерела даних. Виберіть поля "Прізвище" та "Ім’я" як відображувані значення.
Створіть ще один запит "Запит3", поки не вказуючи джерело даних, а потім натисніть кнопку Об’єднання на вкладці Конструктор, щоб перетворити цей запит на запит на об’єднання.
Скопіюйте та вставте інструкції SQL із вкладок "Запит1" і "Запит2" на вкладку "Запит3". Обов'язково вилучіть зайві крапку з комою й додайте ключове слово
UNION. Ви можете перевірити результат у вікні табличного подання даних.Додайте речення сортування до одного із запитів, а потім вставте інструкцію
ORDER BYв запит на об'єднання в режимі SQL. Зверніть увагу: у запиті на об’єднання (вкладка "Запит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 відображає п’ять зразків записів:
| Зайнятість | Прізвище | Ім’я |
|---|---|---|
| Штатний | 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
Це маленька хитрість. Оскільки умова завжди хибна, запит нічого не повертає. Об’єднавши цю інструкцію з наявною інструкцією 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 ALLUNION ALL".
Додавання підсумків у запиті на об’єднання
Запит на об'єднання призначено для об'єднання набору записів з одним записом, який містить суму одного або кількох полів.
Нижче наведено інший приклад, який можна відтворити в зразку бази даних Northwind, щоб навчитися підбивати підсумки в запиті на об’єднання.
Створіть простий запит, щоб проаналізувати придбання пива (Ідентифікатор продукту=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];Перейдіть у вікно табличного подання даних, і ви побачите такі чотири записи про придбання:
Дата отримання Кількість 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))Перейдіть у вікно табличного подання даних, і ви побачите тільки один запис:
MaxOfDate Received SumOfQuantity 05.04.2006 510 Об’єднайте ці два запити в запит на об’єднання, щоб додати запис із загальною кількістю до даних про придбання:
SELECT [Purchase Order Details].[Date Received], [Purchase Order Details].Quantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) UNION SELECT Max([Date Received]), Sum([Quantity]) AS SumOfQuantity FROM [Purchase Order Details] WHERE ((([Purchase Order Details].[Product ID])=34)) ORDER BY [Purchase Order Details].[Date Received];Перейдіть у вікно табличного подання даних, і ви побачите чотири записи про придбання, після суми кожного з яких буде зазначено загальну кількість.
Дата отримання Кількість 22.01.2006 60 22.01.2006 100 04.04.2006 50 05.04.2006 300 05.04.2006 510
Ми охопили тільки основи додавання підсумків до запиту на об’єднання. Ви також можете додати фіксовані значення до обох типів запитів, як-от "Докладно" та "Усього", щоб візуально відокремити підсумковий запис від решти записів. Дізнатися про використання фіксованих значень можна з розділу Об’єднання трьох і більше таблиць або запитів у запиті на об’єднання.
Робота з окремими записами в запитах на об’єднання з використанням ключових слів UNION ALL
Запити на об’єднання в Access за замовчуванням містять тільки окремі записи. Та чи можна додати всі записи? Розгляньмо черговий приклад.
У попередньому розділі ми показали вам, як створити підсумковий запис у запиті на об’єднання. Змініть цей запит на об'єднання, додавши Product ID = 48до нього SQL такі параметри:
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.
Створіть простий вибірковий запис за допомогою цього
SQLсинтаксису:SELECT Employees.City, Employees.City AS Filter FROM Employees;Перейдіть у вікно табличного подання даних, і ви побачите такі результати:
Місто Фільтр Seattle Seattle Bellevue Bellevue Redmond Redmond Kirkland Kirkland Seattle Seattle Redmond Redmond Seattle Seattle Redmond Redmond Seattle Seattle Мабуть, ви помітили, що ці результати не надто змістовні. Розгорніть запит і перетворіть його на запит на об'єднання, використавши такі
SQLдії:SELECT Employees.City, Employees.City AS Filter FROM Employees UNION SELECT "<All>", "*" AS Filter FROM Employees ORDER BY City;Перейдіть у вікно табличного подання даних, і ви побачите такі результати:
Місто Фільтр <Усі> * Bellevue Bellevue Kirkland Kirkland Redmond Redmond Seattle Seattle Access об'єднує всі дев'ять раніше виведених записів за допомогою фіксованих значень полів "Усі" <> й "*". Оскільки це речення об'єднання не містить
UNION ALL, Access повертає лише окремі записи. Це означає, що кожне місто повертається лише один раз з однаковими фіксованими значеннями.Виконавши запит на об’єднання, що виводить кожну назву міста тільки один раз і дає змогу швидко вибрати всі міста, ви можете скористатися цим запитом як джерелом записів для поля зі списком у формі. Використовуючи цей особливий зразок як модель, можна створити елемент керування "поле зі списком" у формі, установити цей запит його джерелом записів, установити для властивості "Ширина стовпця" стовпця "Фільтр" значення 0 (нуль), щоб приховати його, а потім установити для властивості "Приєднаний стовпець" значення 1, щоб указати індекс другого стовпця.
FilterДо властивості форми можна додати код, подібний до наведеного нижче, щоб активувати фільтр форми за допомогою значення, вибраного в елементі керування "поле зі списком":Me.Filter = "[City] Like '" & Me![FilterComboBoxName].Value & "'" Me.FilterOn = TrueПісля цього користувач форми зможе відфільтрувати записи форми за певною назвою міста або вибрати " <Усі> ", щоб відобразити всі записи для всіх міст.