SQL 在 PostgreSQL 中使用 ALL 进行查询的意外结果
Unexpected result of SQL query with ALL in PostgreSQL
我有一个非常简单的 table countries(name, gdp, continent)
,其中包含我从维基百科收集的数据(实际上,并不重要)。如果我想知道每个大陆有多少个国家
SELECT continent, COUNT(*) AS cnt
FROM countries
GROUP BY continent;
我得到以下结果:
continent | cnt
---------------+-----
Africa | 56
Asia | 46
South America | 12
North America | 22
Europe | 46
Oceania | 14
所以我有每个内容对应的国家。无论如何,只有196行,所以数据很小。
不,我想使用查询来获取每个大洲的 GDP 最高的国家/地区。查询也很简单,如下所示:
SELECT name, continent, gdp
FROM countries c1
WHERE gdp >= ALL (SELECT gdp
FROM countries c2
WHERE c2.continent = c1.continent);
然而,我得到的结果是:
name | continent | gdp
----------------------------+---------------+----------------
Australia | Oceania | 1748000000000
Brazil | South America | 1810000000000
People's Republic of China | Asia | 19910000000000
United States | North America | 25350000000000
简而言之,缺少Europe
和Africa
对应的国家。从数据上看,GDP最高的国家是德国,但不明白为什么不在结果集中。
作为测试,如果我运行查询
SELECT continent, MAX(GDP) AS max_gdp
FROM countries
GROUP BY continent;
我正确地得到了每个大陆的 6 个 GDP 值(包括德国的正确值):
continent | max_gdp
---------------+----------------
Africa | 498060000000
Asia | 19910000000000
South America | 1810000000000
North America | 25350000000000
Europe | 4319000000000
Oceania | 1748000000000
为什么 ALL
查询缺少欧洲和非洲国家的 2 行?
问题原来是 NULL 值,正如 a_horse_with_no_name 所怀疑的那样。
请注意,在 PostgreSQL 中有一种更高效的方法来编写此查询:
SELECT DISTINCT ON (continent)
name, continent, gdp
FROM countries
ORDER BY continent, gdp DESC NULLS LAST;
对于每个大洲,这将按 ORDER BY
顺序输出第一行。
我有一个非常简单的 table countries(name, gdp, continent)
,其中包含我从维基百科收集的数据(实际上,并不重要)。如果我想知道每个大陆有多少个国家
SELECT continent, COUNT(*) AS cnt
FROM countries
GROUP BY continent;
我得到以下结果:
continent | cnt
---------------+-----
Africa | 56
Asia | 46
South America | 12
North America | 22
Europe | 46
Oceania | 14
所以我有每个内容对应的国家。无论如何,只有196行,所以数据很小。
不,我想使用查询来获取每个大洲的 GDP 最高的国家/地区。查询也很简单,如下所示:
SELECT name, continent, gdp
FROM countries c1
WHERE gdp >= ALL (SELECT gdp
FROM countries c2
WHERE c2.continent = c1.continent);
然而,我得到的结果是:
name | continent | gdp
----------------------------+---------------+----------------
Australia | Oceania | 1748000000000
Brazil | South America | 1810000000000
People's Republic of China | Asia | 19910000000000
United States | North America | 25350000000000
简而言之,缺少Europe
和Africa
对应的国家。从数据上看,GDP最高的国家是德国,但不明白为什么不在结果集中。
作为测试,如果我运行查询
SELECT continent, MAX(GDP) AS max_gdp
FROM countries
GROUP BY continent;
我正确地得到了每个大陆的 6 个 GDP 值(包括德国的正确值):
continent | max_gdp
---------------+----------------
Africa | 498060000000
Asia | 19910000000000
South America | 1810000000000
North America | 25350000000000
Europe | 4319000000000
Oceania | 1748000000000
为什么 ALL
查询缺少欧洲和非洲国家的 2 行?
问题原来是 NULL 值,正如 a_horse_with_no_name 所怀疑的那样。
请注意,在 PostgreSQL 中有一种更高效的方法来编写此查询:
SELECT DISTINCT ON (continent)
name, continent, gdp
FROM countries
ORDER BY continent, gdp DESC NULLS LAST;
对于每个大洲,这将按 ORDER BY
顺序输出第一行。