
Oracle with: questa clausola, introdotta a partire dalla versione Oracle 9.2, consente di eseguire una query in una tabella utilizzando come parametro il risultato di un’altra query.
Come esempio immaginiamo di avere una tabella di rilievi di temperature e voler selezionare i record in cui i valori sono superiori alla media.
create table temperature( id number(10), valore number(10,2), data_rilievo timestamp );
Aggiungiamo un po’ di dati:
ID | VALORE | TIMESTAMP |
1 | 24,3 | 01-LUG-19 10:26:15,820000000 |
2 | 28,2 | 02-LUG-19 10:26:43,310000000 |
3 | 34,8 | 03-LUG-19 10:26:57,810000000 |
4 | 28,7 | 04-LUG-19 10:27:15,819000000 |
5 | 32,5 | 05-LUG-19 10:27:30,714000000 |
Una possibile soluzione per questo problema è la query seguente:
select valore from temperature where valore > ( select avg(valore) from temperature )
che da’ il seguente recordset
VALORE |
34,8 |
32,5 |
Con la clausola WITH costruiamo una tabella temporanea con una sola colonna e una sola riga che contiene il valore medio. Potremo successivamente riferirci al valore contenuto in questo recordset per ritornare il recordset ottenuto con la query standard di prima:
WITH tmpTemperature (tmpMedia) as (SELECT avg(valore) FROM Temperature) SELECT valore FROM Temperature, tmpTemperature WHERE Temperature.valore > tmpTemperature.tmpMedia;
In sostanza si tratta di definire l’oggetto temporaneo che è un recordset con una riga e una colonna; poi si esegue la query sulla tabella delle temperature utilizzando la tabella temporanea definita in virtù della clausola WITH.
Il recordset ritornato è identico a quello di prima:
VALORE |
34,8 |
32,5 |
Quindi fondamentalmente la sintassi della clausola WITH è
WITH tabellaTemporanea (parametro) AS (select di calcolo del parametro) SELECT * FROM tabella1, tabella2, ..., tabellaTemporanea WHERE ... condizione su tabellaTemporanea.parametro... ;
Commenti recenti