Характерные ошибки при решении задач на написание запросов на выборку (SELECT)База данных «Компьютерная фирма»Упражнение 10 |
||
Найдите модели принтеров, имеющих самую высокую цену. Вывести: model, price Задача обычно не вызывает затруднений, однако, иногда встречаются решения подобные следующему: Понятно естественное желание решить задачу без подзапросов. Если бы требовалось вывести только максимальную цену, то тогда группировка была бы не нужна, так как максимум находился бы по всему набору принтеров: Однако в задаче требуется вывести еще и номер (номера) модели, имеющей максимальную цену. Поскольку мы не можем в предложении SELECT использовать агрегатные значения наряду с детализированными (если не использовать группировку по детализированным значениям), то в результате и получаем представленное выше неправильное решение с группировкой по модели. Это решение дает максимальную цену по каждой модели, нам же нужно получить модели, которые имеют абсолютную (по всему набору принтеров) максимальную цену. Итак, приходится использовать подзапрос, в котором вычисляется максимальная цена:
При этом подзапрос может вводиться не только с простым оператором сравнения («=»), но и с предложением IN или >= ALL. Подзапрос можно использовать и в предложении FROM:
Однако это не дает выигрыша в производительности, так как в любом случае вычисление подзапроса выполняется один раз, а потом уже производится сравнение цен для каждой строки. И все же, можно ли решить задачу без подзапроса? Решить упражнение на SQL-EX.RU |