带有ALL运算符的子查询

时间:2014-10-31 04:23:58

标签: sql postgresql

我试图编写一个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很陌生。

3 个答案:

答案 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的答案。