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

Упражнение 38 стр. 1

Найдите страны, владевшие когда-либо как обычными кораблями, так и крейсерами.

Таким образом, нужно найти страны, которые имели корабли типа bc и bb. Слова «владевшие когда-либо» должно, по мнению автора, задействовать следующую логическую цепочку рассуждений:

  • В текущем состоянии БД может не быть корабля какого-либо класса, хотя страна могла их иметь.
  • Тогда откуда мы можем узнать, что такие корабли были? Только по имеющимся в БД классам, поскольку только в таблице Classes имеется информация о типе и стране.
  • Если есть класс, скажем, типа bc (крейсер), то были и корабли этого класса, даже если их нет в таблицах Ships и Outcomes, поскольку информация о нереализованном проекте вряд ли станет доступной.

Вывод: для решения этой задачи нужно рассматривать только таблицу Classes. В результате получаем достаточно простую задачу.

Автор не писал бы это объяснение, если бы ему не присылали подобные нижеприведенному решения с просьбой объяснить причину, по которой их не принимает система. Вот это решение:

Консоль
Выполнить
  1. SELECT DISTINCT c1.country
  2. FROM Classes c1 INNER JOIN
  3. Classes c2 ON c1.country = c2.country INNER JOIN
  4. Ships s1 ON c1.class = s1.class INNER JOIN
  5. Ships s2 ON c2.class = s2.class
  6. WHERE c1.type = 'bb' AND
  7. c2.type = 'bc'
  8. UNION
  9. SELECT DISTINCT c1.country
  10. FROM Classes c1 INNER JOIN
  11. Classes c2 ON c1.country = c2.country INNER JOIN
  12. Ships s1 ON c1.class = s1.class INNER JOIN
  13. Outcomes s2 ON c2.class = s2.ship
  14. WHERE c1.type = 'bb' AND
  15. c2.type = 'bc' OR
  16. c2.type = 'bb' AND
  17. c1.type = 'bc'

Какой формулировке соответствует это решение? Найти страны, у которых в БД имеются корабли обоих типов? Если ответ «да», то это решение все равно не является правильным.

В первом запросе объединения определяются страны, которые в таблице Ships имеют корабли обоих типов. Во втором запросе определяются страны, которые имеют в таблице Ships корабль одного типа, а в таблице Outcomes — другого.

Bookmark and Share
Страницы: 1 2
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE Convert COUNT CROSS APPLY CTE 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 NOT Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100