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

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

Решение 3.13.2

Консоль
Выполнить
  1. SELECT class, SUM(sunk)
  2. FROM (SELECT class, COUNT(*) AS sunk
  3. FROM Ships a JOIN
  4. Outcomes b ON a.name = b.ship AND
  5. a.class <> b.ship
  6. WHERE result = 'sunk'
  7. GROUP BY class
  8. UNION ALL
  9. SELECT class, '1'
  10. FROM Classes a JOIN
  11. Outcomes b ON a.class = b.ship
  12. WHERE result = 'sunk'
  13. UNION ALL
  14. SELECT class, '0'
  15. FROM classes
  16. ) t
  17. -- где классы с числом кораблей больше 2:
  18. WHERE class IN (SELECT t1.class
  19. FROM (SELECT a.class
  20. FROM Classes a LEFT JOIN
  21. Ships b ON a.class = b.class
  22. ) t1 LEFT JOIN (SELECT DISTINCT ship
  23. FROM Outcomes
  24. WHERE ship NOT IN (SELECT name
  25. FROM Ships
  26. )
  27. ) t2 ON t1.class = t2.ship
  28. GROUP BY t1.class
  29. HAVING COUNT(*) > 2
  30. )
  31. GROUP BY class
  32. HAVING SUM(sunk) > 0;


Решение 3.13.3

Консоль
Выполнить
  1. SELECT a.class AS cls, a.num_sunks AS sunk
  2. FROM (SELECT c.class, COUNT (o.ship) AS num_sunks
  3. FROM Outcomes o LEFT JOIN
  4. Ships s ON o.ship = s.name LEFT JOIN
  5. Classes c ON s.class = c.class
  6. WHERE o.result = 'sunk'
  7. GROUP BY c.class) a,
  8. (SELECT c1.class
  9. FROM Ships s1, Classes c1
  10. WHERE s1.class = c1.class
  11. GROUP BY c1.class
  12. HAVING COUNT(name) >= 3
  13. ) B
  14. WHERE a.class = b.class;


Решение 3.13.4

Консоль
Выполнить
  1. SELECT class, COUNT(result) AS sunk
  2. FROM (SELECT class, result, name
  3. FROM Ships LEFT JOIN
  4. Outcomes ON ship=name AND
  5. class IS NOT NULL AND
  6. result = 'sunk'
  7. ) T
  8. GROUP BY class
  9. HAVING COUNT(class) > 2 AND
  10. COUNT(result) > 0;

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

ПиР

Решить задачу на 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 Больше тэгов
Учебник обновлялся
месяц назад
bulk backlinks
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100