我在SQL动物园的嵌套选择中尝试第5个问题(使用Oracle引擎)http://sqlzoo.net/wiki/SELECT_within_SELECT_Tutorial
显示欧洲各国的名称和人口。显示 人口占德国人口的百分比。
我知道正确答案(如下所示),但有些事让我困惑。
SELECT name, CONCAT(ROUND(population/(SELECT population
FROM world WHERE name = 'Germany'),2)*100,'%')
FROM world WHERE continent = 'Europe'
当我运行以下修改后的查询时,只返回一行(阿尔巴尼亚)。
SELECT name, population/(SELECT population
FROM world WHERE name = 'Germany')
FROM world WHERE continent = 'Europe'
想知道是否有人能够阐明甲骨文的内部运作方式,为什么只返回阿尔巴尼亚?令我感到困惑的是,如果没有ROUND(),它为什么不起作用。
答案 0 :(得分:2)
实际上答案是:
SELECT name,
CONCAT(ROUND(population/(SELECT population FROM world WHERE name = 'Germany')*100,0),'%')
FROM world
WHERE continent = 'Europe'
注意结果集舍入为零小数空格。
也就是说,我尝试了您上面的确切代码,但仍然可以获得所有国家/地区的搜索结果:
SELECT name,
population/(SELECT population FROM world WHERE name = 'Germany')
FROM world
WHERE continent = 'Europe'
你感到困惑,因为无论是否使用ROUND()
,它都应该回归,但由于我无法再创造它,我无法解释它。
答案 1 :(得分:0)
更高效的Oracle查询(摆脱子查询)是使用analytic function:
SELECT name,
ROUND(
population
/ MAX( CASE name WHEN 'Germany' THEN population END ) OVER ()
* 100
) || '%'
FROM world;
然而,sqlzoo似乎使用MariaDB,因此您无法将该查询放入网站(但如果您在Oracle中重新创建该表,则可以对其进行测试)。