首先,您需要了解 oracle 如何将此查询转换为评估。
SELECT w1.name
, w1.continent
, w1.population
FROM world w1
WHERE 25000000 >= ALL(SELECT w2.population
FROM world w2
WHERE w2.continent=w1.continent
);
现在优化器将使用 ALL 比较运算符后跟子查询的条件转换为使用 ANY 比较运算符和互补比较运算符的等效条件
SELECT w1.name
, w1.continent
, w1.population
FROM world w1
WHERE NOT(25000000 < ANY (SELECT w2.population
FROM world w2
WHERE w2.continent=w1.continent)
);
然后,优化器使用带有 ANY 比较运算符的条件转换规则将第二个查询进一步转换为以下查询,然后是相关子查询:
SELECT w1.name
, w1.continent
, w1.population
FROM world w1
WHERE
NOT EXISTS (SELECT w2.population
FROM world w2
WHERE w2.continent=w1.continent
AND 25000000 < w2.population
);
这是我从 oracle 源链接中获取的
对于您的问题:
- 是的,oracle 会处理这个问题,正如转换所暗示的那样,oracle 如何转换上述查询。但更好地理解这个最终结果查询是如何工作的。
- 是的,这可以在没有相关子查询的情况下完成,但无论如何你必须加入同一个表,因为你需要比较表中具有相同大陆的其他记录。[如果我错了,请纠正我]