Вкладення запиту в інший запит або у вираз за допомогою підзапиту

Інколи потрібно використати результати запиту як поле в іншому запиті або як умову для поля запиту. Наприклад, потрібно визначити інтервал між замовленнями для кожного з товарів. Щоб створити запит, який відображатиме цей інтервал, потрібно порівняти кожну дату замовлення з іншими датами замовлення цього товару. Для порівняння цих дат замовлень також потрібен запит. Цей запит можна вкласти в головний запит за допомогою підзапит.

Підзапит можна написати у вираз або в операторі мови структурованих запитів (SQL) у режим SQL.

У цій статті

Використання результатів запиту як поля в іншому запиті

Використання підзапиту як умови для поля запиту

Поширені ключові слова SQL, які можна використовувати з підзапитом

Використання результатів запиту як поля в іншому запиті

Підзапит можна використовувати як псевдонім (SQL) поля. Використовуйте підзапит як псевдонім поля, коли результати підзапиту потрібно використовувати як поле в головному запиті.

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

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

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

Настроювання бази даних Northwind

  1. На вкладці Файл виберіть пункт Створити.

  2. У розділі Наявні шаблони натисніть кнопку Зразки шаблонів.

  3. Виберіть елемент Борей і натисніть кнопку Створити.

  4. Виконайте вказівки на сторінці Northwind Traders (на вкладці об'єкта Початкова сторінка), щоб відкрити цю базу даних, а потім закрийте діалогове вікно входу.

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

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

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

  4. Двічі клацніть поле Ідентифікатор товару та поле Дата замовлення, щоб додати їх до бланка запиту.

  5. У рядку Сортування у стовпці Ідентифікатор товару бланка виберіть пункт За зростанням.

  6. У рядку Сортування у стовпці Дата замовлення бланка виберіть пункт За спаданням.

  7. У третьому стовпці бланка клацніть правою кнопкою миші рядок Поле та виберіть у контекстному меню пункт Масштаб.

  8. У діалоговому вікні Масштаб введіть або вставте такий вираз:

    Попередня дата: (SELECT MAX([Дата замовлення]) 
    FROM [Замовлення товарів] AS [Старі замовлення]
    WHERE [Старі замовлення].[Дата замовлення] < [Замовлення товарів].[Дата замовлення]
    AND [Старі замовлення].[Код товару] = [Замовлення товару].[Код товару])

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

  1. У четвертому стовпці бланка в рядку Поле введіть такий вираз:

    Інтервал: [Дата замовлення]-[Попередня дата]

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

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

    1. Після запуску запит відображає список імен, дат замовлень, попередніх дат замовлень та інтервал між датами замовлень. Результати сортуються спочатку за кодом товару (за зростанням), а потім за датою замовлення (за спаданням).

    2. Примітка : Оскільки "Ідентифікатор товару" – це поле підстановки, за промовчанням у програмі Access відображаються значення підстановки (у цьому випадку ім'я товару), а не фактичні ідентифікатори товарів. Хоча це змінює значення, які відображаються, порядок сортування не змінюється.

  2. Закрийте базу даних "Борей".

Вгорі сторінки

Використання підзапиту як умови для поля запиту

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

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

  1. Відкрийте базу даних Борей 2007.accdb і ввімкніть її вміст.

  2. Закрийте форму входу.

  3. На вкладці Створити у групі Додатково клацніть елемент Конструктор запиту.

  4. У діалоговому вікні Відображення таблиці на вкладці Таблиці двічі клацніть пункти Замовлення та Працівники.

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

  6. У таблиці "Замовлення" двічі клацніть поля Ідентифікатор працівника, Ідентифікатор замовлення та Дата замовлення, щоб додати їх до бланка запиту. У таблиці "Працівники" двічі клацніть поле Посада, щоб додати його до бланка.

  7. Клацніть правою кнопкою миші рядок Критерії стовпця "Ідентифікатор працівника" та виберіть у контекстному меню пункт Масштаб.

  8. У вікні Масштаб введіть або вставте такий вираз:

    IN (SELECT [Ідентифікатор] FROM [Працівники] 
    WHERE [Посада]<>'Торговий представник')

    Це і є підзапит. Він вибирає всі ідентифікатори працівників, для яких не вказано посаду "Торговий представник", і передає цей набір результатів до головного запиту. Головний запит перевіряє, чи є в наборі результатів ідентифікатори працівників із таблиці "Замовлення".

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

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

Вгорі сторінки

Поширені ключові слова SQL, які можна використовувати з підзапитом

Є кілька ключових слів SQL, які можна використовувати з підзапитом.

Примітка : Цей список не вичерпний. У підзапиті можна використовувати будь-яке припустиме ключове слово SQL, за винятком ключових слів для визначення даних.

  • ALL   . Використовуйте слово ALL у реченні WHERE для отримання рядків, які відповідають умові під час порівняння з кожним рядком, повернутим підзапитом.

Наприклад, потрібно проаналізувати дані про студентів у коледжі. Студенти повинні підтримувати середній академічний бал, який відрізняється залежно від спеціалізації. Спеціалізації та їхні мінімальні середні академічні бали зберігаються в таблиці "Спеціалізації", а відповідні відомості про студентів зберігаються в таблиці "Записи_студентів".

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

SELECT [Спеціалізація], [Мін_бал] 
FROM [Спеціалізації]
WHERE [Мін_бал] < ALL
(SELECT [Бал] FROM [Записи_студентів]
WHERE [Записи_студентів].[Спеціалізація]=[Спеціалізації].[Спеціалізація]);
  • ANY   . Використовуйте слово ANY в реченні WHERE для отримання рядків, які відповідають умові під час порівняння із щонайменше одним рядком, повернутим підзапитом.

    Наприклад, потрібно проаналізувати дані про студентів у коледжі. Студенти повинні підтримувати середній академічний бал, який відрізняється залежно від спеціалізації. Спеціалізації та їхні мінімальні середні академічні бали зберігаються в таблиці "Спеціалізації", а відповідні відомості про студентів зберігаються в таблиці "Записи_студентів".

    Щоб переглянути список спеціалізацій (і їхні мінімальні середні академічні бали), для яких жоден студент із цією спеціалізацією не відповідає мінімальному середньому академічному балу, можна використати такий запит:

    SELECT [Спеціалізація], [Мін_бал] 
    FROM [Спеціалізації]
    WHERE [Мін_бал] < ANY
    (SELECT [Бал] FROM [Записи_студентів]
    WHERE [Записи_студентів].[Спеціалізація]=[Спеціалізації].[Спеціалізація]);

    Примітка : Також для цього можна використати ключове слово SOME; ключове слово SOME – синонім слова ANY.

  • EXISTS   . Використовуйте слово EXISTS у реченні WHERE, щоб указати, що підзапит має повернути принаймні один рядок. Перед словом EXISTS можна вставити слово NOT, щоб указати, що підзапит не має повертати жодного рядка.

    Наприклад, наведений нижче запит повертає список товарів, знайдених принаймні в одному наявному замовленні:

    SELECT *
    FROM [Товари]
    WHERE EXISTS
    (SELECT * FROM [Відомості про замовлення]
    WHERE [Відомості про замовлення].[Ідентифікатор товару]=[Товари].[Ідентифікатор]);

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

    SELECT *
    FROM [Товари]
    WHERE NOT EXISTS
    (SELECT * FROM [Відомості про замовлення]
    WHERE [Відомості про замовлення].[Ідентифікатор товару]=[Товари].[Ідентифікатор]);
  • IN   . Використовуйте слово IN у реченні WHERE для перевірки, чи значення в поточному рядку головного запиту входить до набору, який повертає підзапит. Перед словом IN можна вставити слово NOT, щоб перевірити, чи значення в поточному рядку головного запиту не входить до набору, який повертає підзапит.

    Наприклад, наведений нижче запит повертає список замовлень (із датами замовлення), оброблених працівниками, крім торгових представників:

    SELECT [Ідентифікатор замовлення], [Дата замовлення]
    FROM [Замовлення]
    WHERE [Ідентифікатор працівника] IN
    (SELECT [Ідентифікатор] FROM [Працівники]
    WHERE [Посада]<>'Торговий представник')

    Використовуючи слова NOT IN, той самий запит можна записати таким чином:

    SELECT [Ідентифікатор замовлення], [Дата замовлення]
    FROM [Замовлення]
    WHERE [Ідентифікатор працівника] NOT IN
    (SELECT [Ідентифікатор] FROM [Працівники]
    WHERE [Посада]='Торговий представник');

Вгорі сторінки

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

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

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

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

×