Использование запроса в другом запросе или выражении в виде подзапроса

Иногда необходимо использовать результаты, возвращаемые запросом, в качестве поля в другом запросе либо в критерии поля запроса. Предположим, например, что необходимо просмотреть интервалы между заказами каждого товара. Чтобы создать запрос, возвращающий такой интервал, нужно сравнить дату каждого заказа с датами других заказов данного товара. Для сравнения этих дат необходим еще один запрос. Его можно вложить в главный запрос в виде вложенный запрос.

Подзапрос можно создать в виде выражение или оператора языка SQL в режим SQL.

В этой статье

Использование результатов запроса в качестве поля в другом запросе

Использование подзапроса в качестве критерия поля запроса

Стандартные ключевые слова SQL, которые можно использовать в подзапросе

Использование результатов запроса в качестве поля в другом запросе

Подзапрос можно использовать в качестве псевдоним (SQL) поля. Псевдоним поля позволяет использовать результаты подзапроса в качестве поля в главном запросе.

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

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

Вернемся к примеру, в котором необходимо просмотреть интервалы между заказами каждого товара. Чтобы определить такой интервал, нужно сравнить дату каждого заказа с датами других заказов данного товара. Создадим запрос, возвращающий эти сведения из шаблона базы данных "Борей".

Инструкции по настройке базы данных "Борей"

  1. На вкладке Файл нажмите кнопку Создать.

  2. В группе Доступные шаблоны щелкните элемент Образцы шаблонов.

  3. Выберите шаблон Борей и нажмите кнопку Создать.

  4. Следуйте инструкциям на странице Борей (на вкладке объектов Заставка), чтобы открыть базу данных, а затем закройте окно входа.

  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, которое аналогично ключевому слову 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.

×