loading..
Русский    English
17:45
листать

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

Но есть же еще один вариант, когда имеются только головные корабли в Outcomes, причем обоих типов. Добавьте, например, в свою базу данных следующие строки:

  1. INSERT INTO Classes
  2. VALUES('c_bb', 'bb' , 'AAA' ,10 ,15 , 35000);
  3. INSERT INTO Classes
  4. VALUES('c_bc', 'bc', 'AAA', 6, 15, 45000);
  5. INSERT INTO Outcomes
  6. VALUES('c_bb', 'Guadalcanal', 'ok');
  7. INSERT INTO Outcomes
  8. VALUES('c_bc', 'Guadalcanal', 'ok');

Страна ААА имеет корабли обоих типов. Однако вышеприведенный запрос не выведет эту страну, как это и следовало ожидать.

Замечу также, что предложение DISTINCT в обоих запросах совершенно излишне, так как UNION устранит возможные дубликаты. С точки зрения логики это замечание не является существенным. Однако с точки зрения оптимизации это достаточно важный момент. Сервер тратит значительные ресурсы на удаление дубликатов, поэтому не стоит это делать несколько раз. Сравните планы выполнения запросов с DISTINCT и без него.

А вот пример половинчатого решения, принимаемого системой на момент его написания:

Консоль
Выполнить
  1. SELECT DISTINCT country
  2. FROM Classes RIGHT JOIN
  3. (SELECT DISTINCT COALESCE(ship, name) AS name, class
  4. FROM Outcomes FULL OUTER JOIN
  5. Ships ON ship = name
  6. )AS z ON z.name = Classes.class OR
  7. z.class = Classes.class
  8. WHERE type = 'bb' AND
  9. country IN (SELECT country
  10. FROM classes
  11. WHERE type = 'bc'
  12. );

Здесь берутся все корабли из обеих таблиц — Ships и Outcomes. Далее результат соединяется с таблицей Classes, определяется класс кораблей, и отбираются только те из них, которые имеют тип bb (боевые корабли). Наконец, проверяется, что страна найденных кораблей имеет также классы bc. Решение оказалось правильным только потому, что страны, имеющие классы обоих типов, имеют в текущем состоянии БД корабли типа ‘bb’.

Заблокировать подобные решения очень просто: достаточно добавить в таблицу Classes два класса (типа ‘bc’ и ‘bb’) для страны, которая вообще не имеет кораблей в БД. Однако лучше уточнить формулировку, скажем, так:

Найдите страны, имеющие классы как обычных боевых кораблей ('bb'), так и крейсеров ('bc').

Изменение формулировки уже выполнено на сайте. Тем не менее, надеюсь, что проведенный анализ решений оказался полезным для вас.

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

Bookmark and Share
Страницы: 1 2
Тэги:
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