Delphi 3 и создание приложений баз данных

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


Часто невозможно обойтись одним подзапросом. Тогда в подзапросе используют вложенный подзапрос.

Пример. Составить список отгрузки товаров покупателю, который в свое время купил максимальную партию какого-либо товара (результат на рис. 25.40).

SELECT RRR.* FROM RASHOD RRR

WHERE RRR.POKUP IN

(SELECT R.POKUP FROM RASHOD R

WHERE KOLVO = (SELECT MAX(RSH.KOLVO) FROM RASHOD RSH)

)

ЗАМЕЧАНИЕ.

IN использован вместо знака равенства на тот случай, если встретится два и более покупателя, имеющие одинаковое число максимальных покупок. В этом случае запрос вернет записи из RASHOD по всем таким покупателям. Использование знака равенства '=' вместо IN способно привести к ошибке при выдаче в качестве результата "среднего" запроса (SELECT R.POKUP...) множества значений вместо требуемого одного.

Логический порядок выполнения запроса.

Вычисляется максимальное значение в столбце KOLVO ("самый вложенный" подзапрос SELECT MAX). Далее в "среднем" подзапросе SELECT R.POKUP выбирается покупатель, купивший какой-либо товар в количестве, равном значению, вычисленному в "самом вложенном" подзапросе. Вслед за этим "самый главный" запрос SELECT RRR выбирает записи с покупателем, наименование которого выдано "средним" подзапросом.

ЗАМЕЧАНИЕ.

Поставленную задачу могут выполнить и другие запросы,например

SELECT RRR.* FROM RASHOD RRR

WHERE RRR.POKUP IN

(SELECT R.POKUP FROM RASHOD R GROUP BY R.POKUP

HAVING MAX(R.KOLVO) = (SELECT MAX(RSH.KOLVO) FROM RASHOD RSH)

)



Содержание раздела