まず最初に、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比較演算子を使用して条件を変換するためのルールを使用して、2番目のクエリを次のクエリにさらに変換し、その後に相関サブクエリを実行します。
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
);
これは私がオラクルのソースリンクから取ったものです
あなたの質問のために:
- はい、オラクルはこれを処理します。変換が示唆するように、オラクルは上記のクエリをどのように変換しますが、この最終結果のクエリがどのように機能するかをよりよく理解してください。
- はい、これは相関サブクエリなしで実行できますが、同じ大陸を持つテーブル内の他のレコードを比較する必要があるため、とにかく同じテーブルで結合する必要があります。[間違っている場合は修正してください]