Aller au contenu
Sous-requêtes & CTE

WITH (CTE)

Une CTE (WITH) donne un nom à un résultat intermédiaire, utilisable ensuite comme une table dans la requête. On découpe ainsi un calcul complexe en étapes lisibles et vérifiables.

  • CTE
  • Common Table Expression
  • WITH
  • lisibilité

Syntaxe

Modèle
WITH etape1 AS (  SELECT ...),etape2 AS (  SELECT ... FROM etape1)SELECT * FROM etape2;

Exemple

Exemple concret
WITH montants AS (  SELECT o.customer_id,         SUM(oi.quantity * p.price) AS montant  FROM orders o  JOIN order_items oi ON oi.order_id = o.id  JOIN products p ON p.id = oi.product_id  WHERE o.status <> 'annulé'  GROUP BY o.customer_id)SELECT c.name, ROUND(m.montant, 2) AS montantFROM montants mJOIN customers c ON c.id = m.customer_idWHERE m.montant > 150ORDER BY m.montant DESC;-- Jeu de données : boutique-- Clients ayant dépensé plus de 150 €-- Résultat attendu :-- Lucas Martin | 209.96-- Emma Dubois | 179.98

À retenir

  1. Plusieurs CTE se séparent par des virgules, et chacune peut lire les précédentes : WITH a AS (…), b AS (SELECT … FROM a) SELECT … FROM b.
  2. Méthode de mise au point : exécutez d'abord la CTE seule (SELECT * FROM montants), vérifiez-la, puis construisez la requête finale dessus.
  3. Piège : une CTE n'existe que pour la requête qui la suit immédiatement. Ce n'est ni une table ni une vue : pour la réutiliser ailleurs, créez une vue.
  4. Une CTE citée plusieurs fois peut être recalculée à chaque fois. SQLite (3.35+) et PostgreSQL (12+) acceptent AS MATERIALIZED pour forcer un calcul unique.

Voir aussi