loading..
Русский    English
23:36
листать

Упражнение 26 (подсказки и решения)

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

Решение 4.12.1

Консоль
Выполнить
  1. SELECT AVG(price)
  2. FROM (SELECT price
  3. FROM PC
  4. WHERE model IN (SELECT model
  5. FROM product
  6. WHERE maker='A' AND
  7. type='PC'
  8. )
  9. UNION
  10. SELECT price
  11. FROM Laptop
  12. WHERE model IN (SELECT model
  13. FROM product
  14. WHERE maker='A' AND
  15. type='Laptop'
  16. )
  17. ) AS prod;

Решение 4.12.2

Консоль
Выполнить
  1. SELECT AVG(price)
  2. FROM (SELECT price, model
  3. FROM pc
  4. WHERE model IN (SELECT model
  5. FROM product
  6. WHERE maker='A' AND
  7. type='PC'
  8. )
  9. UNION
  10. SELECT price, model
  11. FROM Laptop
  12. WHERE model IN (SELECT model
  13. FROM product
  14. WHERE maker='A' AND
  15. type='Laptop'
  16. )
  17. ) AS prod;

Первое из этих решений дает на основной базе результат 772.5, а второе — 773.0 при правильном значении 734.5454545454545.

В запросе 4.12.1 выбираются цены на все модели производителя А из таблицы PC. Затем они объединяются с ценами на все модели производителя А из таблицы Laptop. Наконец, вычисляется среднее значение. Что же тут неправильного? Ошибка состоит в том, как объединяются цены. Оператор UNION исключает дубликаты, поэтому из нескольких одинаковых цен (если таковые имеются) будет оставаться только одна. Как результат, среднее будет посчитано по неверному количеству.

В запросе 4.12.2 выбирается не только цена, но и номер модели. То есть объединение выполняется по паре атрибутов. Это решение было бы правильным, если бы в соответствующей таблице не было одинаковых моделей с одинаковыми ценами. Последнее было бы гарантировано, если бы пара атрибутов {price, model} являлась первичным ключом. Однако согласно нашей схеме это не так. Сама по себе такая ситуация не является нереальной. Представим себе, что одна модель комплектуется большим диском, чем другая модель с тем же номером, а памяти, наоборот, имеет меньше. Тогда цены у них вполне может быть одинаковы. Естественно, может быть несколько идентичных моделей.

В результате объединения будут исключены дубликаты пар {price, model} и, как следствие, получен неверный результат.

Надеемся, теперь вполне очевидно, как следует решать эту задачу.

Вернуться к обсуждению упражнения 26

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


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