loading..
Русский    English
15:59
листать

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

Рассмотрим решение, которое учитывает даты сражений, но все же является не вполне верным:

Консоль
Выполнить
  1. SELECT t.name
  2. FROM (SELECT o.ship AS name, battle
  3.       FROM Outcomes o
  4.       ) t, Battles b
  5. WHERE t.battle = b.name
  6. GROUP BY t.name
  7. HAVING (SELECT result
  8.         FROM Outcomes, Battles
  9.         WHERE ship = t.name AND
  10.               battle = name AND
  11.               date = MIN(b.date)
  12.         ) = 'damaged' AND
  13.        (SELECT result
  14.         FROM Outcomes, Battles
  15.         WHERE ship = t.name AND
  16.               battle = name AND
  17.               date = MAX(b.date)
  18.         ) IN ('damaged', 'ok', 'sunk') AND
  19.         COUNT(t.name) > 1;

В этом решении участвовавшие в сражениях корабли группируются по именам, после чего остаются только те которые отвечают следующим условиям:

  •     в сражении с минимальной датой корабль должен быть поврежден;

  •     в сражении с максимальной датой результат сражения может быть любым;

  •     число сражений должно быть больше одного.

Логическая ошибка, допущенная в этом запросе, заключается в том, что если корабль участвовал более чем в двух сражениях, то в первом своем сражении (сражении с минимальной датой) корабль может и не быть поврежден. Более точно, результат его сражения должен быть ok, чтобы представленное выше решение перестало давать правильный результат. Действительно, потоплен корабль быть не может, иначе бы он не участвовал в более поздних сражениях. Если бы он был поврежден, то запрос его бы справедливо учитывал. А вот если последовательность результатов будет следующей: ok, damaged и любой из трех возможных, то представленное решение его бы не выводило, хотя такой корабль и отвечает условиям задачи.

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

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


Bookmark and Share
Тэги:
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]
Перепечатка материалов сайта возможна только с разрешения автора.