嵌套在SQL中选择

时间:2016-05-13 15:57:00

标签: sql oracle

我在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(),它为什么不起作用。

2 个答案:

答案 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中重新创建该表,则可以对其进行测试)。