0Pricing
SQL Interview Prep · Lezione

Concatenare più CTE

Creare una pipeline di passaggi denominati che fanno riferimento l'uno all'altro

Concatenare più CTE è una lezione SQL Interview Prep gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Interview Prep, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Interview Prep include 4 lezioni in totale.

Perché concatenare le CTE

I problemi reali dei colloqui raramente si risolvono in un solo passaggio. Concatenare le CTE consente di creare una pipeline di fasi con nome, in cui ogni fase trasforma l’output della precedente. Questo rispecchia il modo in cui un senior engineer scompone una query complessa in parti gestibili.

Invece di annidare le sottoquery fino a tre livelli di profondità, scrive ogni passaggio una sola volta, gli assegna un nome e consente ai passaggi successivi di farvi riferimento.

La sintassi separata da virgole

Per definire diverse CTE, scrive WITH una sola volta, quindi separa ogni blocco con nome con una virgola. Non deve ripetere la parola chiave WITH.

  • Un solo WITH all’inizio.
  • Una virgola tra ogni definizione di CTE.
  • Nessuna virgola prima della query principale finale.
WITH a AS (
    SELECT customer_id FROM orders
),
b AS (
    SELECT customer_id FROM a
)
SELECT *
FROM b;

Le CTE successive possono fare riferimento a quelle precedenti

Il vantaggio della concatenazione: una CTE può leggere da qualsiasi CTE definita prima di essa. Questa visibilità solo in avanti consente di creare una catena di dipendenze.

Una CTE precedente non può vedere una CTE successiva, quindi l’ordine è importante. Disponga le fasi partendo dai dati grezzi fino alla forma finale.

WITH filtered AS (
    SELECT *
    FROM events
    WHERE event_type = 'purchase'
),
per_user AS (
    SELECT user_id, COUNT(*) AS purchases
    FROM filtered
    GROUP BY user_id
)
SELECT *
FROM per_user;

Esempio svolto: pipeline in tre fasi

Domanda: tra i clienti che hanno speso più di 1000 dollari, qual è la spesa media? Lo si può suddividere in tre fasi: calcolare la spesa totale per cliente, filtrare chi ha speso molto e infine calcolare la media.

Il nome di ogni CTE ne documenta lo scopo, così chi esamina la query comprende immediatamente il flusso.

WITH spend AS (
    SELECT customer_id, SUM(amount) AS total
    FROM orders
    GROUP BY customer_id
),
big_spenders AS (
    SELECT customer_id, total
    FROM spend
    WHERE total > 1000
)
SELECT AVG(total) AS avg_big_spend
FROM big_spenders;

L’ordine delle definizioni è importante

Poiché la visibilità è solo in avanti, una CTE che dipende da un’altra deve essere elencata dopo la propria dipendenza. Se fa riferimento a un nome non ancora definito, il database genera un errore «relation does not exist».

Una buona abitudine consiste nel leggere l’elenco delle CTE dall’alto verso il basso e verificare che ogni nome utilizzato sia già comparso sopra di esso.

Fare riferimento a una CTE da più CTE

Una singola CTE può alimentare diverse CTE a valle. È qui che la concatenazione supera le sottoquery annidate: calcola una volta il risultato di base e crea da quello più rami.

Qui sia active sia recent leggono da base, evitando di duplicare la logica.

WITH base AS (
    SELECT * FROM users WHERE deleted = false
),
active AS (
    SELECT id FROM base WHERE last_login > NOW() - INTERVAL '7 days'
),
recent AS (
    SELECT id FROM base WHERE created_at > NOW() - INTERVAL '30 days'
)
SELECT (SELECT COUNT(*) FROM active) AS active_cnt,
       (SELECT COUNT(*) FROM recent) AS recent_cnt;

Unire due CTE

Le CTE concatenate vengono spesso unite nella query principale. Calcoli separatamente ciascun lato, quindi li combina. In questo modo ogni calcolo rimane isolato e l’unione è semplice.

Di seguito calcoliamo separatamente il numero di ordini e quello dei rimborsi, quindi li uniamo per cliente.

WITH orders_cte AS (
    SELECT customer_id, COUNT(*) AS orders
    FROM orders GROUP BY customer_id
),
refunds_cte AS (
    SELECT customer_id, COUNT(*) AS refunds
    FROM refunds GROUP BY customer_id
)
SELECT o.customer_id, o.orders, COALESCE(r.refunds, 0) AS refunds
FROM orders_cte o
LEFT JOIN refunds_cte r ON r.customer_id = o.customer_id;

La leggibilità prima dell’annidamento

Confronti una sottoquery annidata su tre livelli con una pipeline di tre CTE. La versione annidata costringe chi legge a svolgere mentalmente la query dall’interno verso l’esterno. La versione con CTE segue invece l’ordine di esecuzione, dall’alto verso il basso.

Nei colloqui, gli intervistatori apprezzano l’approccio con CTE perché è quello che vorrebbero mantenere in produzione. Dare un nome a ogni fase equivale ad aggiungere una documentazione che non diventa mai obsoleta.

Un errore comune nella concatenazione

Chi è alle prime armi spesso aggiunge una virgola dopo l’ultima CTE, subito prima del SELECT principale. Questa virgola finale causa un errore di sintassi.

  • Le virgole vanno solo tra le definizioni delle CTE.
  • La parentesi di chiusura finale è seguita direttamente dalla query principale, senza virgola.

Un’altra insidia consiste nel dimenticare che ogni CTE deve contenere un SELECT completo all’interno delle parentesi.

Ogni fase viene eseguita separatamente?

Un aspetto sottile da colloquio: logicamente la pipeline si legge come una sequenza di passaggi distinti, ma l’ottimizzatore può inserirli e fonderli in un unico piano di esecuzione. Nella maggior parte dei motori non è obbligatorio pagare il costo della materializzazione dei risultati intermedi.

La concatenazione La aiuta quindi a ragionare sulla query senza necessariamente penalizzare le prestazioni. Menzionarlo dimostra una comprensione approfondita.

Dare alle fasi nomi da pipeline

Buoni nomi per le fasi trasformano una query in codice autoesplicativo. Preferisca nomi che descrivono l’output di ogni passaggio, non l’operazione.

  • spend e big_spenders sono preferibili a step1 e step2.
  • Chi legge dovrebbe poter intuire l’intero flusso basandosi solo sui nomi delle CTE.
  • Una denominazione coerente tra le fasi rende evidente l’unione nella query principale.

In un colloquio, dare nomi chiari alle fasi segnala che sa scrivere codice SQL di produzione facile da mantenere.

Verifica rapida

Verifichi la Sua comprensione del modo in cui le CTE concatenate fanno riferimento l’una all’altra.

Riepilogo: concatenare le CTE

Ha imparato a creare pipeline: un solo WITH, definizioni di CTE separate da virgole e visibilità solo in avanti, per cui ogni fase può leggere le fasi precedenti.

  • Ordini le CTE partendo dai dati grezzi fino al risultato finale.
  • Riutilizzi una CTE di base in diversi passaggi a valle.
  • Nessuna virgola finale prima della query principale.
  • La concatenazione migliora la leggibilità senza necessariamente penalizzare le prestazioni.

Prossimo argomento: confronto tra CTE, sottoquery e tabelle temporanee.

Domande Frequenti

La lezione «Concatenare più CTE» è gratuita?

Sì — il testo completo di «Concatenare più CTE» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Interview Prep, passa a CoddyKit PRO. Il corso SQL Interview Prep include 4 lezioni in totale.

Cosa imparerò in «Concatenare più CTE»?

Creare una pipeline di passaggi denominati che fanno riferimento l'uno all'altro Eserciti SQL Interview Prep con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare SQL Interview Prep?

Non è richiesta alcuna esperienza precedente. SQL Interview Prep su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.

Quanto tempo richiede la lezione «Concatenare più CTE»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione SQL Interview Prep?

Sì. Ogni lezione SQL Interview Prep include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Scrivere il primo CTE
  2. Concatenare più CTE
  3. CTE, sottoquery o tabella temporanea
  4. Ristrutturare query annidate in CTE
← Torna a SQL Interview Prep