MySQL world database Попытка избежать подзапроса
-
06-07-2019 - |
Вопрос
Я использую MySQL WORLD базы данных.
Для каждого континента я хочу вернуть название страны с наибольшим населением.
Мне удалось найти запрос, который работает. Попытка найти другой запрос, который использует только соединение, и избежать подзапроса.
Есть ли способ написать этот запрос, используя JOIN?
SELECT Continent, Name
FROM Country c1
WHERE Population >= ALL (SELECT Population FROM Country c2 WHERE c1.continent = c2.continent);
+---------------+----------------------------------------------+
| Continent | Nanme |
+---------------+----------------------------------------------+
| Oceania | Australia |
| South America | Brazil |
| Asia | China |
| Africa | Nigeria |
| Europe | Russian Federation |
| North America | United States |
| Antarctica | Antarctica |
| Antarctica | Bouvet Island |
| Antarctica | South Georgia and the South Sandwich Islands |
| Antarctica | Heard Island and McDonald Islands |
| Antarctica | French Southern territories |
+---------------+----------------------------------------------+
11 rows in set (0.14 sec)
Решение
Это " наибольший n на группу " проблема, которая часто возникает в StackOverflow.
SELECT c1.Continent, c1.Name
FROM Country c1
LEFT OUTER JOIN Country c2
ON (c1.continent = c2.continent AND c1.Population < c2.Population)
WHERE c2.continent IS NULL;
Объяснение: выполните объединение в поисках страны c2
с таким же континентом и большим населением. Если вы не можете найти его (что обозначено внешним объединением, возвращающим NULL для всех столбцов c2
), то c1
должна быть страной с наибольшим населением на этом континенте. . р>
Обратите внимание, что здесь можно найти более одной страны на каждом континенте, если есть привязка к позиции № 1. Другими словами, может быть две страны, для которых не существует третьей страны с большим населением.