首先,您需要了解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比較運算符後跟一個子查詢成等價的條件,即使用任何比較運算符和互補的比較運算符
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源Link
採取了你的問題:
- 是oracle會照顧這作爲變換表明,甲骨文如何改變上述query.But更好地瞭解如何爲此結果查詢工作。
- 是的,這可以完成沒有相關的子查詢,但無論如何,你必須加入相同的表,因爲你需要比較表中有相同的大陸的其他記錄[請改正我,如果我錯了]
下面是數據/查詢小提琴:http://sqlfiddle.com/#!4/2aed1/1 – Wilduck 2013-02-19 21:10:34