Cosa sono le espressioni di tabella comuni (CTE)?
Una Common Table Expression (CTE) è il set di risultati di una query che esiste temporaneamente e può essere utilizzata solo nel contesto di una query più ampia. Proprio come una tabella derivata, il risultato di un CTE non viene archiviato ed esiste solo per la durata della query. Questo articolo si concentrerà sui CTE non ricorrenti.
In che modo i CTE sono utili?
I CTE, come le visualizzazioni del database e le tabelle derivate, consentono agli utenti di scrivere e gestire più facilmente query complesse grazie a una maggiore leggibilità e semplificazione. Questa riduzione della complessità si ottiene decostruendo query normalmente complesse in blocchi semplici da utilizzare e riutilizzare se necessario per riscrivere la query. Esempi di casi d'uso includono:
- Necessità di fare riferimento a una tabella derivata più volte in una singola query
- Un'alternativa alla creazione di una vista nel database
- Esecuzione dello stesso calcolo più volte su più componenti della query
Come creare un CTE
- Avvia un CTE utilizzando "CON"
- Fornire un nome per la query del risultato che sarà presto definita
- Dopo aver assegnato un nome, segui con "COME"
- Specifica i nomi delle colonne (passaggio facoltativo)
- Definisci la query per produrre il set di risultati desiderato
- Se sono richiesti più CTE, inizia ogni espressione successiva con una virgola e ripeti i passaggi 2-4.
- Fai riferimento ai CTE sopra definiti in una query successiva
Sintassi
WITH
expression_name_1 AS
(CTE query definition 1)
[, expression_name_X AS
(CTE query definition X)
, etc ]
SELECT expression_A, expression_B, ...
FROM expression_name_1
##Esempio CTELa seguente query risponde alla domanda aziendale:"qual è il costo medio mensile per campagna per le attività di marketing dell'azienda?" Ciò potrebbe essere ottenuto con una query derivata (mostrata di seguito); tuttavia, l'utilizzo di un CTE migliora la leggibilità
-- define CTE:
WITH Cost_by_Month AS
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2)
-- use CTE in subsequent query:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM Cost_by_Month
GROUP BY campaign
ORDER BY campaign
Utilizzando una query derivata:
SELECT campaign, avg(monthly_cost) as "Avg Monthly Cost"
FROM
-- this is where the derived query is used
(SELECT campaign_id AS campaign,
TO_CHAR(created_date, 'YYYY-MM') AS month,
SUM(cost) AS monthly_cost
FROM marketing
WHERE created_date BETWEEN NOW() - INTERVAL '3 MONTH' AND NOW()
GROUP BY 1, 2
ORDER BY 1, 2) as Cost_By_Month
GROUP BY campaign
ORDER BY campaign
Documentazione
- Postgres
- Spostamento verso il rosso
- Oracolo
- Server SQL