loading..
Русский    English
17:08
листать

Упражнение 10

Найдите модели принтеров, имеющих самую высокую цену. Вывести: model, price

Задача обычно не вызывает затруднений, однако, иногда встречаются решения подобные следующему:

Консоль
Выполнить
  1. SELECT model, MAX(DISTINCT price)
  2. FROM Printer
  3. GROUP BY model;

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

Консоль
Выполнить
  1. SELECT MAX(price)
  2. FROM Printer;

Однако в задаче требуется вывести еще и номер (номера) модели, имеющей максимальную цену. Поскольку мы не можем в предложении SELECT использовать агрегатные значения наряду с детализированными (если не использовать группировку по детализированным значениям), то в результате и получаем представленное выше неправильное решение с группировкой по модели. Это решение дает максимальную цену по каждой модели, нам же нужно получить модели, которые имеют абсолютную (по всему набору принтеров) максимальную цену.

Итак, приходится использовать подзапрос, в котором вычисляется максимальная цена:

Консоль
Выполнить
  1. SELECT model, price 
  2. FROM Printer 
  3. WHERE price = (SELECT MAX(price)
  4.                FROM Printer
  5.                );

При этом подзапрос может вводиться не только с простым оператором сравнения («=»), но и с предложением IN или >= ALL.

Подзапрос можно использовать и в предложении FROM:

Консоль
Выполнить
  1. SELECT model, price
  2. FROM Printer pr, (SELECT MAX(price) AS maxprice 
  3.                   FROM Printer
  4.                   ) AS mp
  5. WHERE price = mp.maxprice;

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

И все же, можно ли решить задачу без подзапроса?

ПиР

Решить упражнение на SQL-EX.RU

Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
несколько дней назад
обменять с paxum . Виды отделки потолка для загородного дома
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.