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

Понякога може да искате да използвате резултатите от една заявка като поле в друга заявка или като критерий за поле на заявка. Нека например да искате да видите интервала между поръчките за всеки от вашите продукти. За да създадете заявка, която показва този интервал, трябва да сравните всяка дата на поръчка с други дати на поръчки за този продукт. Сравняването на тези дати на поръчки също изисква заявка. Можете да вложите тази заявка вътре във вашата основна заявка, като използвате подзаявка.

Можете да напишете подзаявка в израз или в инструкция от езика за структурирани заявки (SQL) в SQL изглед.

В тази статия

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

Използване на подзаявка като критерий за поле на заявка

Ключови думи на SQL, често използвани в подзаявки

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

Можете да използвате подзаявка като псевдоним (SQL) на поле. Използвайте подзаявка като псевдоним на поле, когато искате да използвате резултатите от подзаявката като поле във вашата основна заявка.

Забележка: Подзаявка, която използвате като псевдоним на поле, не може да върне повече от едно поле.

Можете да използвате подзаявка като псевдоним на поле, за да показва стойности, които зависят от други стойности в текущия ред, което не е възможно без използване на подзаявка.

Нека да се върнем към примера, в който искате да видите интервала между поръчките за всеки от вашите продукти. За да определите този интервал, трябва да сравните всяка дата на поръчка с други дати на поръчки за този продукт. Можете да създадете заявка, която показва тази информация с помощта на шаблона за бази данни Northwind.

Покажете ми как да конфигурирам Northwind

  1. В раздела Файл щракнете върху Създай.

  2. Под Налични шаблони щракнете върху Шаблони образци.

  3. Щракнете върху Northwind и след това щракнете върху Създай.

  4. Следвайте указанията в страницата Northwind Traders (в раздела Начален екран), за да отворите базата данни, и след това затворете прозореца "Диалог за влизане".

  1. В раздела Създай, в групата Заявки щракнете върху Проектиране на заявки.

  2. В диалоговия прозорец Показване на таблица щракнете върху раздела Заявки и след това щракнете двукратно върху Поръчки за продукта.

  3. Затворете диалоговия прозорец Показване на таблица.

  4. Щракнете двукратно върху полето ИД на продукта и полето Дата на поръчката, за да ги добавите към мрежата за проектиране на заявката.

  5. В реда Сортиране на колоната ИД на продукта от мрежата изберете Възходящо.

  6. В реда Сортиране на колоната Дата на поръчката от мрежата изберете Низходящо.

  7. В третата колона от мрежата щракнете с десния бутон върху реда Поле и след това щракнете върху Мащабиране в контекстното меню.

  8. В диалоговия прозорец Мащабиране въведете или поставете следния израз:

    Предишна дата: (SELECT MAX([Дата на поръчката]) 
    FROM [Поръчки за продукта] AS [Стари поръчки]
    WHERE [Стари поръчки].[Дата на поръчката] < [Поръчки за продукта].[Дата на поръчката]
    AND [Стари поръчки].[ИД на продукта] = [Поръчки за продукта].[ИД на продукта])

Този израз е подзаявката. За всеки ред подзаявката избира последната дата на поръчка, по-стара от последната дата на поръчка, която вече е асоциирана с реда. Забележете как използвате ключовата дума AS, за да създадете псевдоним на таблица, така че да можете да сравнявате стойности в подзаявката със стойности в текущия ред на основната заявка.

  1. В четвъртата колона от мрежата, в реда Поле въведете следния израз:

    Интервал: [Дата на поръчката]-[Предишна дата]

Този израз изчислява интервала между всяка дата на поръчка и датата на предишната поръчка за този продукт, като използва стойността за предишна дата, която дефинирахме с помощта на подзаявка.

  1. В раздела Проектиране, в групата Резултати щракнете върху Изпълни.

    1. Заявката се изпълнява и показва списък с имена на продукти, дати на поръчки, предишни дати на поръчки и интервали между дати на поръчки. Резултатите са сортиран първо по ИД на продукт (във възходящ ред) и след това по дата на поръчка (в низходящ ред).

    2. Забележка: Тъй като "ИД на продукт" е справочно поле, по подразбиране Access показва стойностите от справката (в този случай името на продукта), а не действителните идентификатори на продуктите. Въпреки че това променя стойностите, които се показват, то не променя реда на сортиране.

  2. Затворете базата данни Northwind.

Най-горе на страницата

Използване на подзаявка като критерий за поле на заявка

Можете да използвате подзаявка като критерии за поле. Използвайте подзаявка като критерий за поле, когато искате да използвате резултатите от подзаявка, за да ограничите стойностите, които полето показва.

Нека например да искате да прегледате списък с поръчки, обработени от служители, които не са представители за продажбите. За да генерирате този списък, трябва да сравните ИД на служителите за всяка поръчка със списък с ИД на служители, които не са представители за продажбите. За да създадете този списък и да го използвате като критерий за поле, използвайте подзаявка, както е показано в следната процедура:

  1. Отворете базата данни Northwind 2007.accdb и разрешете нейното съдържание.

  2. Затворете формуляра за влизане.

  3. В раздела Създаване, в групата Други щракнете върху Проектиране на заявка.

  4. В диалоговия прозорец Показване на таблица, в раздела Таблици щракнете двукратно върху Поръчки и Служители.

  5. Затворете диалоговия прозорец Показване на таблица.

  6. В таблицата "Поръчки" щракнете двукратно върху полето ИД на служителя, полето ИД на поръчката и полето Дата на поръчката, за да ги добавите към мрежата за проектиране на заявката. В таблицата "Служители" щракнете двукратно върху полето Длъжност, за да го добавите към мрежата за проектиране.

  7. Щракнете с десния бутон върху реда Критерии на колоната "ИД на служителя" и след това щракнете върху Мащабиране в контекстното меню.

  8. В полето Мащабиране въведете или поставете следния израз:

    IN (SELECT [ИД] FROM [Служители] 
    WHERE [Длъжност]<>'Представител за продажбите')

    Това е подзаявката. Тя избира всички ИД на служители, за които служителят няма длъжността "Представител за продажбите", и подава тази група резултати на основната заявка. След това основната заявка проверява дали ИД на служителите от таблицата "Поръчки" са в групата резултати.

  9. В раздела Проектиране, в групата Резултати щракнете върху Изпълни.

    Заявката се изпълнява и резултатите от заявката показват списък с поръчки, които са били обработени от служители, който не са представители за продажбите.

Най-горе на страницата

Ключови думи на SQL, често използвани в подзаявки

Има няколко ключови думи на SQL, които можете да използвате с подзаявка:

Забележка: Този списък не е пълен. В подзаявките можете да използвате всяка валидна ключова дума на SQL с изключение на ключови думи за дефиниране на данни.

  • ALL    Използвайте ALL в клауза WHERE, за да извлечете редовете, които удовлетворяват условието, когато се сравнят с всеки ред, върнат от подзаявката.

Нека например да анализирате данни за студенти от колеж. Студентите трябва да поддържат минимална средна оценка, наречена GPA, която е различна за различните курсове. Курсовете и техните минимални GPA се съхраняват в таблица с име "Курсове", а информацията за съответния студент е записана в таблица с име "Записи_за_студенти".

За да видите списък на курсовете (и техните минимални оценки), в които всеки студент има оценка над минималната, можете да използвате следната заявка:

SELECT [Курс], [Мин_GPA] 
FROM [Курсове]
WHERE [Мин_GPA] < ALL
(SELECT [GPA] FROM [Записи_за_студенти]
WHERE [Записи_за_студенти].[Курс]=[Курсове].[Курс]);
  • ANY    Използвайте ANY в клауза WHERE, за да извлечете редове, които удовлетворяват условието, когато се сравнят с поне един от редовете, върнати от подзаявката.

    Нека например да анализирате данни за студенти от колеж. Студентите трябва да поддържат минимална средна оценка, наречена GPA, която е различна за различните курсове. Курсовете и техните минимални GPA се съхраняват в таблица с име "Курсове", а информацията за съответните студент е записана в таблица с име "Записи_за_студенти".

    За да видите списък на курсовете (и техните минимални оценки), в които някой студент има оценка над минималната, можете да използвате следната заявка:

    SELECT [Курс], [Мин_GPA] 
    FROM [Курсове]
    WHERE [Мин_GPA] > ANY
    (SELECT [GPA] FROM [Записи_за_студенти]
    WHERE [Записи_за_студенти].[Курс]=[Курсове].[Курс]);

    Забележка: Можете също да използвате за същата цел ключовата дума SOME; ключовата дума SOME е синоним на ANY.

  • EXISTS    Използвайте EXISTS в клауза WHERE, за да укажете, че подзаявката трябва да върне поне един ред. Можете също да поставите NOT пред EXISTS, за да укажете, че подзаявката не трябва да върне нито един ред.

    Например следната заявка връща списък с продукти, които са намерени в поне една съществуваща поръчка:

    SELECT *
    FROM [Продукти]
    WHERE EXISTS
    (SELECT * FROM [По-подробно за поръчките]
    WHERE [По-подробно за поръчките].[ИД на продукта]=[Продукти].[ИД]);

    С помощта на NOT EXISTS заявката връща списък с продукти, които не са намерени поне в една съществуваща поръчка:

    SELECT *
    FROM [Продукти]
    WHERE NOT EXISTS
    (SELECT * FROM [По-подробно за поръчките]
    WHERE [По-подробно за поръчките].[ИД на продукта]=[Продукти].[ИД]);
  • IN    Използвайте IN в клауза WHERE, за да проверете дали някоя стойност в текущия ред на основната заявка е част от набора, върнат от подзаявката. Можете също да поставите отпред NOT, за да проверите дали някоя стойност в текущия ред на основната заявка не е част от набора, върнат от подзаявката.

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

    SELECT [ИД на поръчката], [Дата на поръчката]
    FROM [Поръчки]
    WHERE [ИД на служителя] IN
    (SELECT [ID] FROM [Служители]
    WHERE [Длъжност]<>'Представител за продажбите');

    С помощта на NOT IN можете да запишете същата заявка по следния начин:

    SELECT [ИД на поръчката], [Дата на поръчката]
    FROM [Поръчки]
    WHERE [ИД на служителя] NOT IN
    (SELECT [ID] FROM [Служители]
    WHERE [Длъжност]='Представител за продажбите');

Най-горе на страницата

Разширете уменията си
Преглед на обучението
Получавайте първи новите функции
Присъединете се към участниците в Office Insider

Беше ли полезна тази информация?

Благодарим ви за обратната връзка!

Благодарим ви за вашата обратна връзка. Изглежда, че ще бъде полезно да ви свържем с един от нашите агенти по поддръжката на Office.

×