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

Важно :  Данная статья переведена с помощью машинного перевода, см. Отказ от ответственности. Используйте английский вариант этой статьи, который находится здесь, в качестве справочного материала.

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

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

В этой статье:

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

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

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

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

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

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

Псевдоним поля подзапрос можно использовать для отображения значений, которые зависят от других значений в текущей строке, что невозможно без использования подзапроса. Например сообщите нам возвращают примеру которую вы хотите просмотреть интервал между заказы для каждого из продуктов. Чтобы определить этот интервал, необходимо сравнить датой каждого заказа на другие даты заказа для этого продукта. Можно создать запрос, отображающий эту информацию с помощью шаблона Борей 2007.

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

  1. Нажмите кнопку Microsoft Office Изображение кнопки Office и выберите команду Создать.

  2. В области, расположенной слева, в группе Категории шаблонов щелкните Локальные шаблоны.

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

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

  1. На вкладке Создание в группе Другие нажмите кнопку Конструктор запросов.

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

  3. Закройте диалоговое окно Добавление таблицы.

  4. Дважды щелкните поля Код товара и Дата заказа, чтобы добавить их в таблицу конструктора запросов.

  5. В строке Сортировка столбца Код товара таблицы выберите вариант По возрастанию.

  6. В строке Сортировка столбца Дата заказа таблицы выберите вариант По убыванию.

  7. В третьем столбце таблицы щелкните правой кнопкой мыши строку Поле, а затем выберите в контекстном меню пункт Область ввода.

  8. В диалоговом окне Область ввода введите или вставьте указанное ниже выражение.

    Prior Date: (SELECT MAX([Order Date]) 
    FROM [Product Orders] AS [Old Orders]
    WHERE [Old Orders].[Order Date]
    < [Product Orders].[Order Date]
    AND [Old Orders].[Product ID]
    = [Product Orders].[Product ID])

    Это выражение является подзапросом. Для каждой строки подзапрос выбирает дату последнего заказа, которая предшествует дате заказа, уже связанного с данной строкой. Обратите внимание на ключевое слово AS, которое создает псевдоним таблицы, чтобы можно было сравнивать значения в подзапросе со значениями в текущей строке главного запроса.

  9. В четвертом столбце таблицы в строке Поле введите следующее выражение:

Interval: [Order Date]-[Prior Date]

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

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

    Запрос выполняется и выводит список наименований товаров, дат заказов, дат предшествующих заказов и интервалов между этими датами. Результаты сортируются сначала по коду товара (в порядке возрастания), а затем по дате заказа (в порядке убывания).

    Примечание : Поскольку код товара является полем подстановок, по умолчанию Access выводит значения подстановок (в данном случае — наименование товара), а не фактические коды товаров. Хотя это и меняет отображаемые значения, порядок их сортировки не изменяется.

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

К началу страницы

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

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

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

  1. Откройте файл "Борей 2007.accdb" и активируйте его содержимое.

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

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

  4. В диалоговом окне Добавление таблицы на вкладке Таблицы дважды щелкните элементы Заказы и Сотрудники.

  5. Закройте диалоговое окно Добавление таблицы.

  6. В таблице "Заказы" дважды щелкните поле Код сотрудника, поле Код заказа и поле Дата заказа, чтобы добавить их в таблицу конструктора запросов. В таблице "Сотрудники" дважды щелкните поле Должность, чтобы добавить его в таблицу конструктора.

  7. Щелкните правой кнопкой мыши строку Критерии столбца "Код сотрудника" и выберите в контекстном меню пункт Область ввода.

  8. В окне Область ввода введите или вставьте следующее выражение:

    IN (SELECT [ID] FROM [Employees] 
    WHERE [Job Title]<>'Sales Representative')

    Это подзапрос, который выбирает все коды сотрудников, не являющихся торговыми представителями, и передает набор результатов главному запросу. Главный запрос проверяет, входят ли коды сотрудников из таблицы заказов в этот набор результатов.

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

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

К началу страницы

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

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

Примечание : Приведенный ниже список не является исчерпывающим. В подзапросе можно использовать любое действительное ключевое слово SQL, за исключением слов, применяемых для определения данных.

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

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

    Чтобы просмотреть список специализаций (и соответствующих им минимальных средних баллов), для которых все студенты имеют средний балл выше минимального, можно воспользоваться приведенным ниже запросом.

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] < ALL
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);
  • ANY   . Ключевое слово ANY в предложении WHERE позволяет извлекать строки, соответствующие определенному условию хотя бы для одной из строк, возвращаемых подзапросом.

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

    Чтобы просмотреть список специализаций (и соответствующих им минимальных средних баллов), для которых хотя бы один студент имеет средний балл ниже минимального, можно воспользоваться приведенным ниже запросом.

    SELECT [Major], [Min_GPA] 
    FROM [Majors]
    WHERE [Min_GPA] > ANY
    (SELECT [GPA] FROM [Student_Records]
    WHERE [Student_Records].[Major]=[Majors].[Major]);

    Примечание : С той же целью можно использовать ключевое слово SOME, которое аналогично ключевому слову ANY.

  • EXISTS   . Ключевое слово EXISTS в предложении WHERE указывает, что подзапрос должен возвратить хотя бы одну строку. Перед словом EXISTS также можно указать слово NOT, которое означает, что подзапрос не должен возвратить ни одной строки.

    Например, приведенный ниже запрос возвращает список товаров, которые указаны хотя бы в одном из существующих заказов.

    SELECT *
    FROM [Products]
    WHERE EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);

    С ключевыми словами NOT EXISTS этот запрос возвращает список товаров, которые не указаны ни в одном из существующих заказов.

    SELECT *
    FROM [Products]
    WHERE NOT EXISTS
    (SELECT * FROM [Order Details]
    WHERE [Order Details].[Product ID]=[Products].[ID]);
  • IN   . Ключевое слово IN в предложении WHERE проверяет, входит ли значение в текущей строке главного запроса в набор результатов, возвращаемых подзапросом. Перед словом IN также можно указать слово NOT, чтобы убедиться в том, что значение в текущей строке главного запроса не входит в набор результатов, возвращаемых подзапросом.

    Например, приведенный ниже запрос возвращает список заказов (с датами), обработанных сотрудниками, которые не входят в число торговых представителей.

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]<>'Sales Representative');

    С помощью ключевых слов NOT IN тот же запрос можно переписать следующим образом:

    SELECT [Order ID], [Order Date]
    FROM [Orders]
    WHERE [Employee ID] NOT IN
    (SELECT [ID] FROM [Employees]
    WHERE [Job Title]='Sales Representative');

К началу страницы

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

Совершенствование навыков
Перейти к обучению
Первоочередный доступ к новым возможностям
Присоединиться к программе предварительной оценки Office

Были ли сведения полезными?

Спасибо за ваш отзыв!

Благодарим за отзыв! Возможно, будет полезно связать вас с одним из наших специалистов службы поддержки Office.

×