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)

CTE Multiple e Concatenate

CTE Multiple e Concatenate

L'eleganza delle espressioni WITH si manifesta quando ne colleghi più d'una. Puoi definire tante CTE di fila, separandole con una virgola.

E c'è una cosa che i puristi del refactoring adorano: le CTE successive possono leggere i dati delle CTE precedenti, scompattando calcoli sequenziali pezzo per pezzo!

Esempio 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;

Si tratta di programmazione a blocchi! Ciascun blocco svolge un solo lavoro.

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

Definisci due CTE sequenziali: \n1) 'order_totals' calcola 'customer_id' e il 'order_count' effettuati con `COUNT(*)` da 'orders'.\n2) 'gold_users' legge da 'order_totals' filtrando i clienti con 'order_count >= 2'.\nInfine fai una JOIN dalla tabella 'customers' (estraendo 'first_name' e 'last_name') sui 'gold_users' (ON c.id = g.customer_id), e mostra anche il loro 'order_count'.

Chargement de l'éditeur…
Afficher l'indice

Separa order_totals e gold_users con una virgola (no secondo WITH!)

Solution disponible après 3 tentatives

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

Adesso usiamo CTE multiple per semplificare metriche: Crea 'max_price' (estrae un'unica riga con 'max_value' usando `MAX(unit_price)` da 'order_items'). Nella query principale, estrai ogni 'product_id' e 'unit_price' da 'order_items' e mostra di quanto differisce dal prezzo massimo, calcolando '(SELECT max_value FROM max_price) - unit_price AS difference'. Niente Join, usa una subquery sulla CTE per ottenere un valore!

Chargement de l'éditeur…
Afficher l'indice

WITH 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