CTE
Dare un nome a un risultato intermedio
Sezione intitolata “Dare un nome a un risultato 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.
Puoi separare un passaggio della query, assegnargli un nome e usarlo nella parte successiva.
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
Separare i passaggi rende più chiaro il ragionamento.
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.
Scegli lo strumento che descrive più chiaramente 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.