Databases. Part XIV «Анатомия связанных подзапросов»

Databases. Part XIV «Анатомия связанных подзапросов»

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

Даны таблицы:

Авторы (код автора, фамилия)

Книги (код автора, код книги, название)

Абонемент (код книги, код читателя, дата выдачи, срок возврата, отметка о возврате)

Читатели (код читателя, фамилия)

1. Организация связанного подзапроса с использованием оператора IN

Страшная история №1: Недобросовестные пользователи берут книги в библиотеке и теряют… Когда два или больше экземпляров одной книги потеряно, нужно эти книги заново заказать в типографии или купить. Наша задача узнать, какие книги нужно покупать:

SELECT Название FROM Книги z1

WHERE Код_книги IN(

SELECT Код_книги

FROM Абонемент

WHERE (DateAdd("d",[срок_возврата],[дата_выдачи])<Now()) AND (Отметка_о_возврате=False) AND

(Код_книги=z1.код_книги)

GROUP BY Код_книги

HAVING Count(Код_читателя)>=2)

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

Как это работает??

2. Организация связанного подзапроса с использованием оператора EXISTS

Страшная история №2: Недобросовестные пользователи берут книги в библиотеке и не возвращают… Выведем всех злостных задолжников, не вернувших ни одной книжки обратно в библиотеку:

SELECT distinct Фамилия FROM

Читатели z1 INNER JOIN Абонемент

ON z1.Код_читателя=Абонемент. Код_читателя

WHERE NOT EXISTS(

SELECT * FROM Абонемент z2

WHERE (DateAdd("d",[срок_возврата],[дата_выдачи])<Now()) AND (Отметка_о_возврате=true) AND

(z1.код_читателя=z2.код_читателя))

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

Как это работает??

Существует несколько других операторов для организации связанных подзапросов, например ANY или ALL. Также можно воспользоваться операциями отношения (равно, не равно и т. д). Подробно рассматривать в этой теме их не буду, потому что принцип работы этих запросов аналогичный. И вообще любой связанный подзапрос можно написать, используя операторы ANY и EXISTS. Но это только предположение, пока примера, доказывающего обратное, не придумал :whistle:


Карта сайта


Информационный сайт Webavtocat.ru