loading..
Русский    English
18:26
листать

Упражнение 24 стр. 2

Рассмотрим еще один, хотя и неправильный, подход без использования UNION. Решение использует соединение всех моделей с последующим перебором вариантов при помощи оператора CASE:

Решение 1.16.3

Консоль
Выполнить
  1. SELECT DISTINCT CASE
  2.                     WHEN PC.price > = l.price AND
  3.                          PC.price > = prn.price
  4.                     THEN pc.model
  5.                     WHEN l.price > = PC.price AND
  6.                          l.price > = prn.price
  7.                     THEN l.model
  8.                     WHEN prn.price > = l.price AND
  9.                          prn.price > = pc.price
  10.                     THEN prn.model
  11.                 END AS model
  12. FROM PC, laptop l, printer prn
  13. WHERE PC.price = (SELECT MAX(price)
  14.                   FROM PC
  15.                   ) AND
  16.       l.price = (SELECT MAX(price)
  17.                  FROM Laptop
  18.                  ) AND
  19.       prn.price = (SELECT MAX(price)
  20.                    FROM Printer
  21.                    );

В предложении FROM используется декартово произведение трех таблиц. С помощью предложения WHERE отбираются только те строки, которые содержат модели каждого типа продукции, имеющие максимальную цену в своей продукционной категории. Возникающая здесь избыточность (если, скажем, по две модели из каждой таблицы имеют максимальную цену, то результирующее число строк будет равно восьми — 2*2*2) не является ошибочной, так как возможные дубликаты моделей будут впоследствии устранены при помощи DISTINCT в предложении SELECT. Главное, что каждая строка будет содержать искомую глобальную максимальную цену.

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

Рассмотрим с этой точки зрения следующий вариант данных. Пусть максимальную стоимость имеют модели принтера и ПК. Тогда первое предложение WHEN оператора CASE будет удовлетворено:

  1. WHEN PC.price > = l.price AND
  2.      PC.price > = prn.price
  3. THEN pc.model

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

Попробуйте исправить это решение, не используя оператор UNION.

Решить задачу на SQL-EX.RU

Страницы: 1 2
  • D5100 nikon
    Новости DVD-индустрии. Интернет-магазин аудиотехники.
    digimarket.ru
  • Possoni
    Типов светильников. Форма заказа.
    svet.modul.ru
  • Магазин одежды
    Иллюстрированный каталог товаров. Каталог, прайс-лист.
    fiesta-on.ru
Тэги:
ALL AVG battles CASE CAST CHAR CHARINDEX classes COALESCE Convert COUNT CTE DATEDIFF DATEPART DATETIME DELETE DISTINCT EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IN INNER JOIN insert INTERSECT ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MySQL NOT IN NULL ORDER BY Outcome outcomes OVER PARTITION BY pc PIVOT PostgreSQL printer product Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100