Дана база данных.
Найдите модели принтеров, имеющих самую высокую цену. Вывести: model, price
Задача обычно не вызывает затруднений, однако, иногда встречаются решения подобные следующему:
SELECT model, MAX(DISTINCT price)
FROM Printer
GROUP BY model;
Понятно естественное желание решить задачу без подзапросов. Если бы требовалось вывести только максимальную цену, то тогда группировка была бы не нужна, так как максимум находился бы по всему набору принтеров:
SELECT MAX(price)
FROM Printer;
Однако в задаче требуется вывести еще и номер (номера) модели, имеющей максимальную цену. Поскольку мы не можем в предложении SELECT использовать агрегатные значения наряду с детализированными (если не использовать группировку по детализированным значениям), то в результате и получаем представленное выше неправильное решение с группировкой по модели. Это решение дает максимальную цену по каждой модели, нам же нужно получить модели, которые имеют абсолютную (по всему набору принтеров) максимальную цену.
Итак, приходится использовать подзапрос, в котором вычисляется максимальная цена:
SELECT model, price
FROM Printer
WHERE price = (SELECT MAX(price)
FROM Printer
);
При этом подзапрос может вводиться не только с простым оператором сравнения («=»), но и с предложением IN или >= ALL.
Подзапрос можно использовать и в предложении FROM:
SELECT model, price
FROM Printer pr, (SELECT MAX(price) AS maxprice
FROM Printer
) AS mp
WHERE price = mp.maxprice;
Однако это не дает выигрыша в производительности, так как в любом случае вычисление подзапроса выполняется один раз, а потом уже производится сравнение цен для каждой строки.
Пишите в комментариях , можно ли решить задачу без подзапроса?
Ставьте ❤️, если интересно увидеть решение.
@sqlhub