loading..
Русский    English
11:31
листать

Упражнение 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


Bookmark and Share
Страницы: 1 2 3
Тэги:
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 Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100