loading..
Русский    English
18:44
листать

Упражнение 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

Страницы: 1 2
Тэги:
ALL AVG battles CASE CAST CHAR CHARINDEX classes COALESCE Convert COUNT CTE DATEDIFF DATEPART DATETIME DELETE DISTINCT EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IN INNER JOIN insert INTERSECT ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MySQL NOT IN NULL ORDER BY Outcome outcomes OVER PARTITION BY pc PIVOT PostgreSQL printer product Больше тэгов
Учебник обновлялся
несколько дней назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100