SQL共同相关的子查询以及想象力变得难以想象的情况

时间:2016-01-07 05:36:09

标签: mysql database oracle relational

问候和感谢阅读!

我在确切了解与查询有关的子查询工作方面遇到了一些麻烦,我希望通过在这里提出一些问题来解决这个问题。如果我在任何情况下都错了,请随时纠正我。

到目前为止,我对此有所了解:

  1. 共同相关的子查询是外部选择和内部选择之间的一种相互依赖的查询

  2. 外部选择供稿内部 - 一次选择一个行数据,直到它到达表的末尾

  3. 内部选择一次从外部选择中取一行以匹配其整个表,如果匹配,则将该行添加到结果表中

  4. 在某一点上,满足内部选择条件的所有行都将添加到结果表中,而内部选择将表返回到外部选择。此时,结果表用于检查外部选择WHERE子句的条件。

  5. 最后,符合外部选择条件的行将在结果集中返回。

  6. 现在,我的另一个问题与此查询有关。

       SELECT continent, name, area FROM world x
      WHERE area >= ALL
        (SELECT area FROM world y
            WHERE y.continent=x.continent
              AND area>0)
    

    这是表格格式。

    enter image description here

    以上查询输出"各大洲相对于大陆,名称和区域的最大国家(按地区)"。这是答案。

    enter image description here

    数据库中的continent字段重复,可能是这样的:

    continent country
    Europe    Italy
    Europe    Britain
    Africa    Zimbawea
    Europe    France
    

    如果有人查看上面提到的问题,那么该人怎么可能会到达这个声明"每个大洲最大的国家(按地区)相对于非洲大陆,名称和地区"?对我来说这看起来并不明显。相反,给出一个问题,例如"找到每个大洲的最大国家(按地区),显示大陆,名称和区域",构建查询需要知道什么?

    谢谢!

1 个答案:

答案 0 :(得分:1)

ALL条件将“值与列表中的每个值或查询返回的值”(来自the documentation)进行比较。所以对于这个陈述......

SELECT continent, name, area FROM world x
WHERE area >= ALL
    (SELECT area FROM world y
     WHERE y.continent=x.continent
     AND area>0)

...子查询返回共同相关area的所有continent,如果外部查询中的area一样大,则ALL条件的计算结果为TRUE作为最大的。

许多人发现ALL(和任何,某些)条件不直观。更清晰的表述是:

SELECT continent, name, area FROM world x
WHERE area = 
    (SELECT max(area) FROM world y
    WHERE y.continent=x.continent)

另一种方法使用分析函数:

 SELECT continent, name, area FROM (
     SELECT continent, name, area,
            rank() over (partition by x.continent
                         order by x.area desc ) rnk
     FROM world x 
 )
 where rnk = 1

Anlaytic功能非常整洁。 Find out more