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

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

Решение 3.4.3

Как это ни покажется странным, но нижеприведенный запрос некоторое время принимался системой проверки.

Консоль
Выполнить
  1. SELECT s.name
  2. FROM Ships s JOIN
  3. Outcomes o ON s.name = o.ship JOIN
  4. Battles b ON o.battle = b.name
  5. GROUP BY s.name
  6. HAVING COUNT(s.name) = 2 AND
  7. (MIN(result) = 'damaged' OR
  8. MAX(result) = 'damaged'
  9. )
  10. UNION
  11. SELECT o.ship
  12. FROM Classes c JOIN
  13. Outcomes o ON c.class = o.ship JOIN
  14. Battles b ON o.battle = b.name
  15. WHERE o.ship NOT IN (SELECT name
  16. FROM Ships
  17. )
  18. GROUP BY o.ship
  19. HAVING COUNT(o.ship) = 2 AND
  20. (MIN(result) = 'damaged' OR
  21. MAX(result) = 'damaged'
  22. );

Во-первых, объединяются запросы, которые выполняют соединение участвующих в сражениях кораблей (таблица Outcomes) с таблицами Ships и Classes соответственно. Кстати говоря, предикат

  1. o.ship NOT IN (SELECT name FROM Ships)
во втором запросе явно лишний, так как UNION исключит возможные дубликаты.

Эти соединения не просто избыточны, они ошибочны, так как в описании базы данных сказано, что в таблице Outcomes могут быть корабли, отсутствующие в Ships. То есть если найдется не головной корабль, которого нет в таблице Ships и который отвечает условиям задачи, то он не попадет в результирующий набор вышеприведенного запроса.

Во-вторых, предикат

  1. HAVING COUNT (o.ship) = 2
ограничивает возможные варианты только двумя сражениями корабля. А почему корабль не может принимать участие более чем в двух сражениях? Он же не обязательно был потоплен после того, как получил повреждение. Причем он мог участвовать в сражениях и до повреждения (например, с результатом ok). Тогда, если в следующем и последним для корабля сражении он был поврежден, то запрос 3.4.3 выведет этот корабль, хотя это и не отвечает условиям задачи.

В-третьих, автору не вполне понятно условие:

  1. (MIN(result) = 'damaged' OR MAX(result) = 'damaged')

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