Книги и статьи по SQL Rambler's Top100 Switch language to: English 29 марта 2024 г. 1:51:47


www.sql-ex.ru
Skip Navigation Links  

 

Print  Версия для печати

На главную страницу

Характерные ошибки при решении упражнений. Задача 24

Моисеенко С.И.

Найдите номер модели продукта (ПК, ПК-блокнота или принтера), имеющего самую высокую цену. Вывести: model.

Вот одно из решений, опубликованных на форуме сайта:

(1)
SELECT model FROM
  (SELECT model, price FROM Pc
      WHERE price = (SELECT MAX(price) FROM Pc)
   UNION
   SELECT model, price FROM Laptop 
      WHERE price = (SELECT MAX(price) FROM Laptop)
   UNION
   SELECT model, price FROM Printer
      WHERE price = (SELECT MAX(price) FROM Printer)) T
WHERE price = (SELECT MAX(price) FROM Laptop)

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

Итак, что же делает этот запрос. В каждом из трех аналогичных подзапросов разыскиваются максимальные по цене модели по каждому из трех видов продукции - ПК, блокнотам и принтерам. Далее используется UNION для объединения найденных моделей, что, помимо этого, устраняет дубликаты строк {модель, цена}. Наконец, отбираются только те модели, цена которых совпадает с максимальной ценой на ПК-блокноты.

Поэтому, если максимальной окажется цена на принтеры, то данное решение не будет приниматься системой. Но тогда будет приниматься решение, в котором последней строкой будет:

WHERE price = (SELECT MAX(price) FROM Printer)

Более того, если максимальная цена будет у моделей только одного типа продукции (скажем, принтеров), то будет приниматься еще более неправильно решение:

(2)
SELECT DISTINCT model FROM Printer
WHERE price = (SELECT MAX(price) FROM Printer)

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

Кстати говоря, данные подобраны оптимально к рассматриваемым случаям, но, тем не менее, не спасают от "прохождения" неправильных запросов.

Оставив в стороне вопрос "кто виноват?", сосредоточимся на вопросе "что делать?". Выход, и не только для данной ситуации, можно найти в увеличении количества проверочных баз, где будут смоделированы различные варианты данных. Единственное, что удерживает меня от этого шага, - замедление работы системы, в результате чего пользователь будет дольше находиться в состоянии ожидания. Еще я успокаиваю себя мыслью, что посетителей нашего сайта движет желание изучения языка SQL и повышения квалификации, а не стремление обмануть систему.

Тем не менее, я прошу вас сообщать о случаях прохождения заведомо неверных решений, чтобы улучшить качество системы проверки в пределах, не увеличивающих время отклика.

Приведенные здесь примеры можно выполнить непосредственно на сайте, установив флажок "Без проверки" на странице с упражнениями на SELECT.

Перейти к решению задачи #24

На главную страницу

Print  Версия для печати


Использование любых материалов данного сайта возможно только
при условии обязательного размещения прямой ссылки на сайт
http://www.sqlbooks.ru
на каждой странице, где размещены используемые материалы.

 Начало   Статьи    Книги 
Рейтинг@Mail.ru Rambler's Top100 Alt Упражнения по SQL: обучение, тестирование, сертификация по языку SQL Copyright c 2002-2006. All rights reserved.