我有一张名为' world'的桌子。该表按此顺序包含列:名称,大陆,区域,总体和gdp。我想写的查询是针对下一个问题: 有些国家的人口是其邻国(在同一大洲)的三倍以上。给各个国家和大陆。
我的查询是这样的:
SELECT
name, continent
FROM
world as x
WHERE
x.population/3 > ALL (SELECT population
FROM world as y
WHERE x.continent = y.continent)
但它并没有按照预期的那样发挥作用。可能出现什么问题?
答案 0 :(得分:2)
就我个人而言,我发现使用any
,all
和some
关键字有点难以理解。我发现在明确使用min()
和max()
时解释此类查询会更容易:
SELECT w.name, w.continent
FROM world w
WHERE w.population > (SELECT 3 * MAX(w2.population)
FROM world w2
WHERE w2.continent = w.continent AND
w2.name <> w.name
);
此外,如果子查询可能返回min()
个值,则子查询中使用max()
和NULL
会使其行为更直观。
请注意,我为表格分别包含了表别名,使用来限定列名称。
答案 1 :(得分:1)
您可以使用WHERE NOT EXISTS
:
SELECT x.name, x.continent
FROM world x
WHERE NOT EXISTS ( SELECT 1 FROM world y
WHERE y.continent = x.continent
AND y.name <> x.name
AND y.population >= x.population/3 );
换句话说,让所有在同一大洲没有其他国家的国家,甚至人口的1/3。与使用子查询的聚合相比,它的优势在于它将返回仅包含一个国家的大陆的值。 See SQL Fiddle Demo here(在何处)与this one(MAX)
答案 2 :(得分:0)
SELECT name, continent FROM world x
WHERE population>ALL (SELECT 3*population FROM world y
WHERE x.continent=y.continent
AND x.name<>y.name
AND population>0)