Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ОБЩИЙ_файл_ПОСОБИЕ.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
22.69 Mб
Скачать

Побудова запитів на підставі запитів

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

Рис. 10.48 Вигляд перехресного звіту у режимі таблиці

Розглянемо завдання підрахунку для кожного співробітника (касира) кількості клієнтів, яких вони обслужили. Створимо для цієї мети запит з полями ПІБ з таблиці Касири і ПІБ з таблиці Клієнти. (Окрім названих таблиць, в запит належить включити і таблиці, що їх зв'язують – Чеки та Дисконтні карти). До поля Условие отбора слід додати наступну умову: <>"Ніхто", для того щоб виключити покупки, здійснені без будь-яких дисконтних карт ("Ніхто" прізвище фіктивного покупця у таблиці Дисконтні карти, на яке було створено запис на покупця без будь-якої дисконтної карти).

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

Щоб уникнути такої ситуації на основі тільки що створеного запиту створимо ще один запит. Тепер можна використовувати групову функцію Count, оскільки ми ліквідували значення, що повторюються (рис. 10. 49).

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

Види з'єднань між таблицями в запитах

З'єднання між таблицями в запитах може бути декількох видів. Найбільш поширеним є внутрішнє з'єднання. Якщо таблиці зв'язані відношенням «один-до-багатьох», з'єднання ґрунтуються на унікальному значенні поля первинного ключа в одній таблиці і значеннях поля зовнішнього ключа в іншій таблиці. Подібного роду з'єднання між таблицями MS Access створює автоматично, якщо:

з'єднання було явно задане у вікні Схема данных;

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

Рис. 10.49 Створення запиту на базі іншого запиту

Результатом такого запиту є всі записи, значення зв'язаних полів яких в обох таблицях збігаються. В результуючу множину запиту потрапляють всі записи з головної таблиці (на стороні «один»), для яких є відповідні записи в підлеглій таблиці (на стороні «багато»). Якщо в підлеглій таблиці запису з заданою величиною відсутні, то відповідні записи в головній таблиці в результуючу множину не включаються.

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

Щоб змінити внутрішнє з'єднання таблиць на зовнішнє, слід в режимі конструктора запитів клацнути двічі на лінії, що обєднуєз'єднує таблиці (або вибрати з її контекстного меню команду Параметры объединения). У вікні, що відкрилося (рис. 10. 50), буде відображено три варіанти з'єднання таблиць – одне внутрішнє і два зовнішніх. За умовчанням встановлено внутрішнє з'єднання.

Для звязування даних в одній таблиці застосовують також рекурсивне з'єднання. Воно створюється шляхом додавання таблиці в запит двічі, внаслідок чого MS Access призначає псевдонім для копії.

При використанні рекурсивних з'єднань потрібно задати вивід тільки унікальних значень. Для цього у вікні Свойства запроса слід встановити значення Да для властивості Уникальные значения.

Рис. 10.50 Види з'єднань між таблицями в запиті

Аналогічно рекурсивному з'єднанню можуть бути встановлені з'єднання між довільними полями таблиць чи запитів для виявлення нових зв'язків між даними. Наприклад для вирішення завдання по контролю за сумою покупок клієнтів для видання картки з більшим процентом знижки створюється запит на підставі вже існуючих запитів. На рисунку 10. 51 показано приклад зміненого зв'язку між запитами, на підставі яких створено новий запит. У схемі даних ці запити зєднані зв'язком типу «один-до-одного» по полю Код_клієнта.

Рис. 10.51 Зміна зв'язку між таблицями