CTE
Dare un nome a un passaggio intermedio
Sezione intitolata “Dare un nome a un passaggio intermedio”CTE significa Common Table Expression. Il nome è tecnico, ma l’idea è semplice: crei un risultato temporaneo, gli dai un nome e lo usi subito dopo.
È come prendere appunti mentre risolvi un problema. Invece di tenere tutto in testa, scrivi un passaggio, lo chiami in modo chiaro e poi continui.
WITH ordini_grandi AS ( SELECT id, cliente_id, totale FROM ordini WHERE totale > 100)SELECT id, cliente_id, totaleFROM ordini_grandi;Qui ordini_grandi è un nome temporaneo. Dentro ci sono gli ordini con totale maggiore di 100.
La CTE esiste solo per questa query. Non crea una nuova tabella permanente nel database.
Perché rende le query più leggibili
Sezione intitolata “Perché rende le query più leggibili”Senza CTE, una query lunga può diventare difficile da seguire.
Con una CTE, invece, puoi separare il ragionamento:
- prima preparo un gruppo di dati
- poi uso quel gruppo nella query principale
Il vantaggio è soprattutto mentale. Leggi la query come una piccola storia.
Un esempio con una join
Sezione intitolata “Un esempio con una join”Troviamo prima gli ordini sopra 100 euro. Poi colleghiamoli ai clienti:
WITH ordini_grandi AS ( SELECT id, cliente_id, totale FROM ordini WHERE totale > 100)SELECT clienti.nome, ordini_grandi.totaleFROM ordini_grandiINNER JOIN clienti ON clienti.id = ordini_grandi.cliente_id;La CTE si occupa del primo passaggio: “quali sono gli ordini grandi?”.
La query principale si occupa del secondo: “a quali clienti appartengono?”.
Più CTE nella stessa query
Sezione intitolata “Più CTE nella stessa query”Puoi anche creare più risultati temporanei:
WITH ordini_grandi AS ( SELECT id, cliente_id, totale FROM ordini WHERE totale > 100),clienti_attivi AS ( SELECT id, nome FROM clienti WHERE attivo = TRUE)SELECT clienti_attivi.nome, ordini_grandi.totaleFROM ordini_grandiINNER JOIN clienti_attivi ON clienti_attivi.id = ordini_grandi.cliente_id;Ogni CTE ha un nome e un compito. Questo aiuta molto quando una query cresce.
CTE o subquery?
Sezione intitolata “CTE o subquery?”Una subquery va benissimo quando il passaggio interno è piccolo.
Una CTE diventa più comoda quando vuoi dare un nome al passaggio, riusarlo o rendere la query più leggibile.
Non è una gara tra strumenti. Scegli quello che rende più chiaro il ragionamento.
Riepilogo rapido
Sezione intitolata “Riepilogo rapido”- Una CTE nasce con
WITH. - Crea un risultato temporaneo con un nome.
- Vive solo per la durata della query.
- Aiuta a leggere query lunghe o divise in più passaggi.
- Spesso è più chiara di una subquery molto annidata.