Salta ai contenuti
Manuale LogoManuale Logo

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.

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, 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

Separare i passaggi rende più chiaro il ragionamento.

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.

Scegli lo strumento che descrive più chiaramente 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.