Вложение запросов

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

Предположим, необходимо извлечь всю информацию о банке с которым

работает Киров.

Вот один из способов решения:

SELECT * FROM БАНКИ

WHERE IDN =(SELECT IDN_БАНКА FROM КЛИЕНТ WHERE ИМЯ=‘Киров’)

Выходные данные:

IDN РЕКВИЗИТЫ
  Менатеп

Чтобы оценить основной запрос, SQL должен оценить внутренний запрос (или подзапрос) в предложении WHERE. Подзапрос оценивается так как если бы он был основным запросом: просматриваются все строки таблицы Клиент и выбираются те строки, для которых значение поля имя равно Киров, для таких строк выбираются значения поля IDN_БАНКА.

В результате выбранной оказывается строка с IDN_БАНКА = 323. SQL подставляет его в предикат основного запроса вместо подзапроса, теперь предикат читается следующим образом:

WHERE IDN =323

После этого основной запрос выполняется как обычный, его результат показан

выше.

Если указать просто:

WHERE IDN =323

можно освободиться от подзапроса, но использование подзапроса

делает процедуру более гибкой.

В следующем примере использование подзапроса обязательно.

Получить все банки, которые не используются клиентами:

SELECT * FROM Банки

WHERE

 
 

(SELECT COUNT(*) FROM Клиент WHERE Клиент.Idn_банка = Банки.Idn) = 0

Еще один пример, когда необходимо использовать подзапрос:

Для каждой группы товаров найти товар с минимальной ценой, вывести название группы, название товара, цену:

SELECT Г.НАЗВАНИЕ, М НАЗВАНИЕ, П.ЦЕНА

FROM Группы Г, МАТ.ЦЕННОСТИ М, ПЕРЕМЕЩЕНИЕ П

WHERE М.IDN_ГРУППЫ = П.IDN_ГРУППЫ

AND М.IDN_МАТ.ЦЕН. = П.IDN_МАТ.ЦЕН.

AND Г.IDN = П.IDN_ГРУППЫ

AND П.ЦЕНА = (SELECT MIN (ЦЕНА) FROM Перемещение ПВНУТР

 
 

WHERE П.IDN_ГРУППЫ = ПВНУТР.IDN_ГРУППЫ)


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: