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

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

Решение 3.14.3

Консоль
Выполнить
  1. SELECT country, AVG(bore*bore*bore/2)
  2. FROM Ships s FULL JOIN
  3. Outcomes o ON s.name = o.ship LEFT JOIN
  4. Classes c ON c.class = ISNULL(s.class, o.ship)
  5. WHERE c.class IS NOT NULL
  6. GROUP BY country;

Ошибка заключается в соединении

  1. Ships s FULL JOIN Outcomes o ON s.name = o.ship

Она проявится в том случае, если какой-либо корабль участвовал в нескольких сражениях, поскольку тогда он будет учтен несколько раз в результирующем наборе. При этом мы не утверждаем, что здесь вообще нельзя использовать полное внешнее соединение. Конечно, нет. Однако нужно позаботиться об исключении дубликатов кораблей.

Решение 3.14.4

Консоль
Выполнить
  1. SELECT country, AVG(bore*bore*bore/2)
  2. FROM (SELECT country, bore, name
  3. FROM Classes LEFT JOIN
  4. Ships ON Ships.class = Classes.class
  5. UNION
  6. SELECT DISTINCT country, bore, ship
  7. FROM Classes C LEFT JOIN
  8. Outcomes O ON O.ship = C.class
  9. WHERE NOT EXISTS(SELECT name
  10. FROM SHips
  11. WHERE name = O.ship) AND
  12. NOT (ship IS NULL)
  13. ) ABC
  14. GROUP BY country;

Рассмотрим ситуацию, когда есть класс (допустим class_1, калибр орудий 12), но нет кораблей этого класса в базе данных, и есть класс (class_2, калибр орудий 14), у которого в базе данных есть только головной корабль, упомянутый в таблице Outcomes. При этом оба класса принадлежат одной стране, скажем, country_1. Тогда первый запрос в объединении, если добавить для наглядности столбец class, в предложении FROM даст:

country bore Name class
country_1 12 NULL class_1
country_1 14 NULL class_2

в то время как из второго запроса получим правильный результат:

country bore Name class
country_1 14 class_2 class_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 INFORMATION_SCHEMA INNER JOIN insert INTERSECT IS NOT NULL IS NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker Больше тэгов
Учебник обновлялся
месяц назад
мани
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.