Pillole Oracle: la clausola WITH

Spread the love

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:

IDVALORETIMESTAMP
124,301-LUG-19 10:26:15,820000000
228,202-LUG-19 10:26:43,310000000
334,803-LUG-19 10:26:57,810000000
428,704-LUG-19 10:27:15,819000000
532,505-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...
;

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.