Passer au contenu principal
eLearner.app
Module 14 · Leçon 2 sur 354/57 dans le cours~15 min
Leçons du module (2/3)

CTEs multiples et enchaînées

CTE multiples et chaînés

L’élégance des expressions AVEC brille vraiment lorsque vous en enchaînez plusieurs. Vous pouvez définir plusieurs CTE à la suite, en les séparant par une virgule.

Et voici quelque chose que les puristes du refactoring adorent : les CTE ultérieurs peuvent lire les données des CTE antérieurs, décompressant les calculs séquentiels morceau par morceau !

Exemple multi-CTE

SQL
WITH premium_customers AS (
  SELECT customer_id, SUM(total_amount) AS total_spent
  FROM orders
  GROUP BY customer_id
),
top_customers AS (
  SELECT * FROM premium_customers
  WHERE total_spent > 5000
)
SELECT c.first_name, tc.total_spent
FROM customers c
JOIN top_customers tc ON c.id = tc.customer_id;

C'est une programmation de type bloc ! Chaque bloc ne fait qu'un seul travail.

Exercice#sql.m14.l2.e1
Tentatives : 0Chargement…

Définissez deux CTE séquentiels : 1) 'order_totals' calcule 'customer_id' et le 'order_count' placé à l'aide de `COUNT(*)` à partir de 'orders'. 2) 'gold_users' lit à partir de 'order_totals' en filtrant les clients avec 'order_count >= 2'. Enfin, REJOIGNEZ la table 'clients' (en extrayant 'first_name' et 'last_name') avec 'gold_users' (ON c.id = g.customer_id), et affiche également leur 'order_count'.

Chargement de l'éditeur…
Afficher l'indice

Séparez order_totals et gold_users par une virgule (pas de seconde AVEC !)

Solution disponible après 3 tentatives

Exercice#sql.m14.l2.e2
Tentatives : 0Chargement…

Utilisons maintenant plusieurs CTE pour simplifier les métriques : créez « max_price » (extrait une seule ligne avec « max_value » à l'aide de `MAX(unit_price)` de « order_items »). Dans la requête principale, extrayez chaque 'product_id' et 'unit_price' de 'order_items' et montrez à quel point il diffère du prix maximum, en calculant '(SELECT max_value FROM max_price) - unit_price AS différence'. No Join : utilisez une sous-requête sur le CTE pour obtenir une valeur unique !

Chargement de l'éditeur…
Afficher l'indice

AVEC max_price AS (...) SELECT product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items ;

Solution disponible après 3 tentatives