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

Упражнение 55 стр. 3

Решение 3.11.3 (с комментариями автора решения)

Консоль
Выполнить
  1. /*
  2. Год спуска на воду головных кораблей
  3. */
  4. SELECT class, launched AS year
  5. FROM Ships
  6. WHERE name = class
  7. UNION
  8. /*
  9. Минимальный год спуска на воду кораблей по классам,
  10. у которых нет данных по головным кораблям в таблице Ships
  11. */
  12. SELECT class, MIN(launched)
  13. FROM Ships
  14. WHERE class NOT IN (SELECT class
  15. FROM Ships
  16. WHERE name = class
  17. )
  18. GROUP BY class
  19. UNION
  20. /*
  21. Выводим NULL в качестве года спуска на воду для классов,
  22. кораблей которых нет в Ships
  23. */
  24. SELECT class, NULL
  25. FROM classes
  26. WHERE class NOT IN(SELECT class
  27. FROM ships
  28. )

В этом решении в соответствии с условием задачи учтены все классы, включая те, которые не имеют кораблей в БД (последний запрос в объединении). По-видимому, допущенная здесь ошибка связана с попыткой отдельного учета головных кораблей (которые являются первыми кораблями в классе и, следовательно, имеют наименьший год спуска на воду) и классов, не имеющих головных кораблей в базе данных.

Представим ситуацию, когда год спуска головного корабля неизвестен (NULL), но при этом он имеется в таблице Ships. Там же находится другой корабль аналогичного класса с известным годом спуска на воду. Тогда именно этот год должен по условию задачи фигурировать в выходном наборе.

Данное же решение даст (первый запрос в объединении) NULL, в то время как корабль с нужным годом будет проигнорирован во втором запросе объединения в силу следующей фильтрации

  1. WHERE class NOT IN (SELECT class
  2. FROM Ships
  3. WHERE name = class
  4. )

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

Решение 3.11.4

Консоль
Выполнить
  1. SELECT class,
  2. (SELECT launched
  3. FROM (SELECT launched
  4. FROM Ships sh
  5. WHERE cl.class = sh.name
  6. UNION
  7. SELECT launched
  8. FROM Ships sh
  9. WHERE launched = (SELECT MIN(launched)
  10. FROM ships sh2
  11. WHERE class = cl.class AND
  12. NOT EXISTS(SELECT launched
  13. FROM ships sh
  14. WHERE cl.class = sh.name
  15. )
  16. )
  17. ) tab
  18. ) year
  19. FROM classes cl

ПиР

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


Страницы: 1 2 3
Тэги:
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