Prima di tutto è necessario capire come trasformare Oracle questa query per valutare.
SELECT w1.name
, w1.continent
, w1.population
FROM world w1
WHERE 25000000 >= ALL(SELECT w2.population
FROM world w2
WHERE w2.continent=w1.continent
);
Ora l'ottimizzatore trasforma una condizione che utilizza l'operatore di confronto ALL seguita da una subquery in una condizione equivalente che utilizza l'QUALSIASI operatore di confronto e un operatore di confronto complementare
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)
);
l'ottimizzatore poi ulteriori trasformazioni la seconda query nella seguente query utilizzando la regola per la trasformazione delle condizioni con l'operatore di confronto ANY seguito da una sottoquery correlata:
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
);
Questo ho preso da fonte Oracle Link
per le vostre domande:
- Sì Oracle si prenderà cura di questo, come suggerisce la trasformazione, come Oracle trasformare il sopra query.But capire meglio come questo fine risultato lavoro di query.
- sì, questo può essere fatto senza sub-query correlata, ma comunque è necessario unirsi alla stessa tabella perché è necessario confrontare altri record nella tabella che ha lo stesso continente. [Si prega di correggermi se ho torto]
fonte
2013-02-19 21:01:23
Ecco un violino per i dati/query: http://sqlfiddle.com/#!4/2aed1/1 – Wilduck