我试图编写一个SQL(Postgres引擎)查询来回答以下问题:
哪些国家的GDP高于亚洲各国? [仅提供名称。](某些国家/地区可能具有NULL gdp值)
下面是一个包含示例数据的缩写SQL表。
+-------------+-----------+---------+------------+--------------+
| name | continent | area | population | gdp |
+-------------+-----------+---------+------------+--------------+
| Afghanistan | Asia | 652230 | 25500100 | 20343000000 |
| Albania | Europe | 28748 | 2831741 | 12960000000 |
| Algeria | Africa | 2381741 | 37100000 | 188681000000 |
| Andorra | Europe | 468 | 78115 | 3712000000 |
| Angola | Africa | 1246700 | 20609294 | 100990000000 |
+-------------+-----------+---------+------------+--------------+
我写了类似下面的内容,什么都没有返回(虽然我知道这不是因为我使用的在线互动指南的答案):
SELECT name
FROM world
WHERE gdp > ALL (SELECT gdp from world WHERE continent = 'Asia')
AND continent<>'Asia'
我应该使用什么查询?我对SQL很陌生。
答案 0 :(得分:2)
严格地说,如果您的表中有一个亚洲国家/地区的GDP不明(NULL
),那么正确答案必须是:
&#34;我们不知道。&#34;
因此,此查询不返回任何行:
SELECT name
FROM world
WHERE gdp > ALL (SELECT gdp from world WHERE continent = 'Asia')
AND continent <> 'Asia';
亚洲GDP的集合中的NULL值使得第一个WHERE
表达式不可能是TRUE
,因此查询永远不会返回行 - 这是正确的答案。我们知道没有符合要求的国家/地区。您的查询是 正确 。
与max(gdp)
相比,您挤压into a comment的变体回答了一个稍微不同的问题:
哪些国家的GDP高于亚洲最大的GDP?
答案 1 :(得分:0)
听起来你想要所有亚洲国家的总和。如果是这样,尝试这样的事情:
select w1.name
from world w1
where w1.gdp > (
select sum(coalesce(w2.gdp,0))
from world w2
where w2.continent='Asia' )
如果没有,并且您只想要具有最高GDP的单一亚洲国家/地区,请将sum
替换为max
。您不需要额外的continent <> 'Asia'
因为没有亚洲国家的GDP可能高于返回值。
答案 2 :(得分:0)
根据@Tony的回答,它应该是这样的:
select w1.name
from world w1
where w1.gdp > (
select max(coalesce(w2.gdp,0))
from world w2
where w2.continent='Asia' )
and w2.gdp is not null;
为什么使用max
代替sum
?因为问的问题是:
哪些国家的GDP高于亚洲各国?
因此,找到亚洲最大的国内生产总值是有效的,您无需与亚洲所有国家进行比较。
很抱歉,由于我的声誉低于50,我无法评论@Tony的答案。