loading..
Русский    English
20:06
листать

Упражнение 37 стр. 2

Всякому, кто внимательно следил за ходом рассуждений, понятно, что в базе данных имеется два корабля класса «Бисмарк». То есть этот класс не должен присутствовать в результатах выполнения запроса.

Чтобы проверить это, добавьте в основную базу данных следующую строку:

  1. INSERT INTO Ships VALUES('Tirpitz', 'Bismark', 1940);

Совет:

Все основные базы данных можно загрузить с http://www.sql-ex.ru/db_script_download.php.

Решение 3.2.2

Следующее решение было построено одним из посетителей сайта после получения приведенных выше объяснений. Оно также дает правильный результат на основной базе данных.

Консоль
Выполнить
  1. SELECT class
  2. FROM Ships sh
  3. WHERE NOT EXISTS (SELECT ship
  4. FROM Outcomes
  5. WHERE ship = sh.class
  6. )
  7. GROUP BY class
  8. HAVING COUNT(*) = 1
  9. UNION
  10. SELECT ship
  11. FROM Outcomes s
  12. WHERE EXISTS (SELECT class
  13. FROM Classes
  14. WHERE class = s.ship
  15. ) AND
  16. NOT EXISTS (SELECT class
  17. FROM Ships
  18. WHERE class = s.ship
  19. );

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

В первом же запросе выбираются все корабли из таблицы Ships кроме тех, для которых в таблице Outcomes имеется головной корабль. Далее выполняется группировка по классу и отфильтровываются (HAVING) только те классы, в которых оказался один корабль.

Таким образом, предполагается, что если в Outcomes имеется головной корабль, то кораблей в данном классе уже минимум два и, следовательно, этот класс не отвечает условиям задачи. В этом и состоит ошибка, так как ниоткуда не следует, что в таблице Ships не может быть головного корабля. Итак, если некий класс имеет один корабль в базе данных, и этот корабль является головным и присутствует в обеих рассматриваемых таблицах, то решение 3.2.2 ошибочно проигнорирует этот класс.


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 INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100