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

Упражнение (-2) стр. 1

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

Решение 3.6.1. Вот характерное решение для начинающих:

Консоль
Выполнить
  1. SELECT country, MAX(x), MIN(launched)
  2. FROM (SELECT country, COUNT(*) x , launched
  3. FROM Ships b, Classes a
  4. WHERE a.class = b.class
  5. GROUP BY country, launched
  6. ) s
  7. WHERE launched = ANY(SELECT MIN(launched)
  8. FROM Ships bb, Classes aa
  9. WHERE bb.class = aa.class
  10. GROUP BY country, launched
  11. )
  12. GROUP BY country;

Подзапрос в предложении FROM определяет количество строк для каждой уникальной пары значений {страна, год спуска на воду}. На языке предметной области это означает, что определяется число кораблей, спущенных на воду каждой страной в каждом году. Пусть результатом выполнения подзапроса s будет следующая таблица:

country x launched
Gt.Britain 6 1916
Gt.Britain 1 1917
Japan 1 1913
Japan 2 1914
Japan 2 1915
Japan 1 1916
Japan 1 1941
Japan 1 1942
USA 1 1920
USA 1 1921
USA 3 1941
USA 2 1943
USA 2 1944

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

Консоль
Выполнить
  1. SELECT MIN(launched)
  2. FROM Ships bb, Classes aa
  3. WHERE bb.class = aa.class
  4. GROUP BY country, launched;

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

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