Que sont les expressions de table communes (CTE) ?
Une expression de table commune (CTE) est l'ensemble de résultats d'une requête qui existe temporairement et à utiliser uniquement dans le contexte d'une requête plus large. Tout comme une table dérivée, le résultat d'un CTE n'est pas stocké et n'existe que pour la durée de la requête. Cet article se concentrera sur les CTE non récurrents.
En quoi les CTE sont-ils utiles ?
Les CTE, comme les vues de base de données et les tables dérivées, permettent aux utilisateurs d'écrire et de gérer plus facilement des requêtes complexes grâce à une lisibilité et une simplification accrues. Cette réduction de complexité est obtenue en déconstruisant des requêtes habituellement complexes en blocs simples à utiliser, et réutiliser si nécessaire, lors de la réécriture de la requête. Exemples de cas d'utilisation :
- Nécessité de référencer plusieurs fois une table dérivée dans une seule requête
- Une alternative à la création d'une vue dans la base de données
- Effectuer le même calcul plusieurs fois sur plusieurs composants de requête
Comment créer un CTE
- Initier un CTE en utilisant "AVEC"
- Fournir un nom pour la requête de résultat qui sera bientôt définie
- Après avoir attribué un nom, faites suivre de "AS"
- Spécifiez les noms des colonnes (étape facultative)
- Définir la requête pour produire l'ensemble de résultats souhaité
- Si plusieurs CTE sont nécessaires, commencez chaque expression suivante par une virgule et répétez les étapes 2 à 4.
- Référencer le ou les CTE définis ci-dessus dans une requête ultérieure
Syntaxe
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
##Example CTELa requête suivante répond à la question commerciale :"quel est le coût mensuel moyen par campagne pour les efforts marketing de l'entreprise ?" Cela pourrait être accompli avec une requête dérivée (illustrée ci-dessous) ; cependant, l'utilisation d'un CTE améliore la lisibilité
-- 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
Utilisation d'une requête dérivée :
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
Documents
- Postgres
- Redshift
- Oracle
- SQLServer