★ DISPONIBILE PER FORMAZIONE E PROGETTI
enrico chiolo

Common Table Expressions

Il costrutto SQL della clausola WITH che tratta le subquery come variabili nominate, rendendo le query di warehouse leggibili e componibili.

Le Common Table Expressions (CTE) sono un costrutto SQL introdotto dalla clausola WITH, che permette di dare un nome a una subquery e referenziarla per nome nel resto della query, trattando le subquery come variabili invece che come blocchi annidati. Sahar Massachi, nella Parte 2 della serie “Stop using Slowly-changing Dimensions!” su DataExpert.io, le definisce il suo “secondo one weird trick” per il data engineering, dopo il date stamping: “CTEs are just fucking fantastic”.1

Come funziona

Invece di annidare subquery dentro subquery, ogni passo intermedio si dichiara con un nome all’inizio della query, dentro un blocco WITH:

WITH
  today_users AS (
    SELECT user_id, followers FROM dim_users
    WHERE ds = '2025-01-16' AND followers >= 1000
  ),
  past_users AS (
    SELECT user_id, followers FROM dim_users
    WHERE ds = '2024-10-01' AND followers < 200
  ),
  past_device AS (
    SELECT user_id, device FROM dim_devices
    WHERE ds = '2024-10-01'
  )
SELECT ...
FROM past_users pu
JOIN today_users tu ON pu.user_id = tu.user_id
JOIN past_device pd ON tu.user_id = pd.user_id

La query si legge dall’alto verso il basso: ogni CTE è un passo nominato, il SELECT finale li compone. La query di retention che chiude la Parte 2 della serie è costruita così, con cinque CTE (today_users, past_users, past_device, user_device, views) composte in un SELECT finale con join multipli; è l’esempio con cui Massachi mostra che una domanda storica complessa, con gli snapshot datestampati e le CTE, resta complessa solo nella logica di business.1

Perché conta

Le CTE trasformano il SQL da linguaggio di interrogazione a linguaggio componibile: la subquery nominata è la stessa astrazione della funzione nominata in programmazione, si definisce una volta, si referenzia per nome, si compone. Ciò che in SQL annidato sarebbe un muro di parentesi diventa una sequenza di passi leggibili. La lettura è coerente con il functional data engineering: ogni CTE è una trasformazione senza effetti collaterali, componibile con le altre, e il SQL, già lingua franca del warehouse, si avvicina alla scrittura di codice ordinario.1

Prestazioni

Motori come Presto e Trino appiattiscono le CTE in fase di ottimizzazione: vengono inlineate, senza overhead di esecuzione, quindi si possono usare liberamente. La raccomandazione di Massachi è verificare che il proprio motore lo faccia (“make sure your query engine flattens them for free”) e poi farne uso liberale: sono il modo standard di scrivere query di warehouse con più di un join o una subquery.1

Voci correlate

Bibliografia e sitografia

  • Sahar Massachi, SCD-2 considered harmful! (Stop using Slowly-changing Dimensions! Part 2), DataExpert.io, 4 novembre 2025. blog.dataexpert.io

Footnotes

  1. Massachi, SCD-2 considered harmful! Part 2, DataExpert.io, 2025. 2 3 4