Le Common Table Expression (CTE) che cosa sono?

Buongiorno a tutti! Ben ritrovati!

Oggi parliamo di Common Table Expression a cui molto piĆ¹ spesso ci si riferisce con l'acronimo CTE.

Cosa sono? CercherĆ² di spiegarlo nel modo piĆ¹ semplice possibile!

Pronti? Via!

 


Le Common Table Expression


Quando mi fanno questa domanda rispondo utilizzando il modo piĆ¹ semplice in cui riesco a definirle:

Una CTE ĆØ un Result set temporaneo a cui associamo un nome ed al quale possiamo riferirci nei vari statements.


Le CTE sono state introdotte ormai un po' di anni fa con il rilascio della versione 2005 di SQL Server ma se non sapete quale versione ĆØ installata potete vedere qui: identificare la versione di sql server installata

L'obbiettivo era quello di prevedere una sintassi estesa che permettesse di scrivere le Query in modo piĆ¹ agevole. Il loro utilizzo potrebbe inoltre portare ad un incremento delle prestazioni ma questo aspetto lo vedremo in futuro.

La sintassi base per l'utilizzo delle CTE ĆØ davvero semplice nel senso che ĆØ sufficiente anteporre al nostro statement INSERT, UPDATE o DELETE che sia la keyword WITH seguita dal nome che vogliamo dare alla Query, seguito a sua volta dalla keyword AS

Ad esempio cosi:


WITH MAXCODICE AS (SELECT MAX(CODICE) AS CODICE FROM ELENCO)
SELECT * FROM MAXCODICE


Ora le CTE portano in dote la possibilitĆ  di scrivere Query ricorsive.

Vedremo quindi i due casi di CTE non ricorsive e ricorsive.

Un esempio di CTE non ricorsiva potrebbe essere questo sotto dove voglio estrarre tutti i codici della mia tabella ELENCO escluso il codice che ha valore massimo.

Potrei scrivere la Query cosƬ:


WITH MAXCODICE AS (SELECT MAX(CODICE) AS CODICE FROM ELENCO)
SELECT * FROM ELENCO E
WHERE NOT EXISTS (SELECT CODICE FROM MAXCODICE T WHERE T.CODICE = E.CODICE)

Come potete vedere la CTE ĆØ ad tutti gli effetti una tabella per cui posso andarci in JOIN.

Vediamo ora come utilizzare una CTE ricorsiva:

Per prima cosa creiamo una CTE di nome RIGHE.
Poi al suo interno inseriamo due statement di SELECT uniti da un operatore di UNION ALL
La prima SELECT ĆØ detta ANCORA.
La seconda SELECT innesca la ricorsione grazie al fatto che ĆØ possibile specificare il nome della CTE stessa (in questo case RIGHE)

WITH RIGHE AS
(
 SELECT 1 AS NUMERO
 UNION ALL
 SELECT NUMERO+1 FROM RIGHE WHERE NUMERO < 10
)
SELECT * FROM RIGHE

 
Eseguiamola per vedere che vengono ritornati proprio i numeri compresi tra 1 e 10.

Questo metodo ĆØ infatti utile ad esempio per generare tabella con un numero prefissato di righe.

Per default uscirĆ  un errore se il numero di ricorsioni supera i valore di 100. 
E' possibile aumentare tale valore tramite il comando OPTION (MAXRECURSION N) 
Dove N puĆ² valere al massimo 32768.
Impostando invece N=0 otterremo una ricorsione infinita.

Per oggi ĆØ tutto, spero di essere riuscito nell'intento di spiegare nel modo piĆ¹ chiaro possibile l'argomento.
Se cosƬ non fosse scrivetemi..

Ciao,


Luca Biondi @ SQLServerPerformance blog!

 

 

 

 

 

 

Help me to share knowledge on my blog  

 

Next post: Di sottoquery ed ottimizzazioni (parte 1)

Previous post: Babbo Natale e gli indici univoci filtrati








Comments

Post a Comment

I Post piĆ¹ popolari

SQL Server, execution plan and the lazy spool (clearly explained)

SQL Server, datetime vs. datetime2

How to solve EXECUTE Permission denied on object 'sp_send_dbmail'