Salta ai contenuti

CTE

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, totale
FROM 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.

Senza CTE, una query lunga può diventare difficile da seguire.

Con una CTE, invece, puoi separare il ragionamento:

  1. prima preparo un gruppo di dati
  2. poi uso quel gruppo nella query principale

Il vantaggio è soprattutto mentale. Leggi la query come una piccola storia.

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.totale
FROM ordini_grandi
INNER 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?”.

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.totale
FROM ordini_grandi
INNER 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.

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.

  • 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.