2010-09-21 58 views

回答

2

的原因是因为:

AND population > 0 

...被过滤掉空行的区域 “欧洲”,名 “梵”,其复杂的:

WHERE population >= ALL (SELECT population 
          FROM ...) 

。因为NULL不是一个值,所以俄罗斯将不会被正确排名。 ALL运算符要求您所比较的值大于或等于ALL从子查询返回的值,当存在​​NULL时永远不会发生这种情况。

我的查询会一直之一:

SELECT region, name, population 
    FROM bbc x 
WHERE population = (SELECT MAX(population) 
         FROM bbc y 
         WHERE y.region = x.region) 

...或者,使用JOIN:

SELECT x.region, x.name, x.population 
    FROM bbc x 
    JOIN (SELECT y.region, 
       MAX(y.population) AS max_pop 
      FROM bbc y 
     GROUP BY y.region) z ON z.region = x.region 
          AND z.max_pop = x.population 
+0

OH所以欧洲是唯一一个空白人口值的地区。我知道了。 – Hamster 2010-09-21 22:10:08

+0

@Hamster:是的,否则你会看到其他地区也退出。 ALL运算符要求您所比较的值大于或等于从子查询返回的所有值,当存在​​NULL时永远不会发生这种情况。 – 2010-09-21 22:11:13

+0

也有NOT NULL选项吗?这可能会更有意义,也许。 – Hamster 2010-09-21 22:14:46

0

不,它不。最大的国家有先验非零人口。

这就像检查一本最大的书是否有任何页面。

+1

我认为这是@仓鼠的问题的问题 - 该条款的那部分在SQLzoo站点给出的示例中 – sasfrog 2010-09-21 21:52:46

+0

如果省略“> 0”子句,则查询返回不同的结果。 – 2010-09-21 21:54:03

+0

是的俄罗斯似乎没有它失踪。我不明白为什么会发生这种情况。 – Hamster 2010-09-21 21:55:01