Salt la conținutul principal
Modulul 14 · Lecția 2 din 354/57 în curs~15 min
Lecții din modul (2/3)

CTE-uri multiple și înlănțuite

CTE multiple și înlănțuite

Eleganța expresiilor WITH strălucește cu adevărat atunci când legați mai multe împreună. Puteți defini mai multe CTE-uri într-un rând, separându-le cu o virgulă.

Și iată ceva ce iubește puriștii din refactorizare: CTE-urile ulterioare pot citi date de la CTE-urile anterioare, despachetând calculele secvențiale bucată cu bucată!

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

Este o programare în stil bloc! Fiecare bloc face o singură treabă.

Exercițiu#sql.m14.l2.e1
Încercări: 0Se încarcă…

Definiți două CTE-uri secvențiale: \n1) „order_totals” calculează „customer_id” și „order_count” plasate utilizând „COUNT (*)” din „comenzi”.\n2) „gold_users” citește din „order_totals” filtrarea clienților cu „order_count >= 2”.\n „first_name” și „last_name”) cu „gold_users” (ON c.id = g.customer_id) și afișează și „order_count” acestora.

Se încarcă editorul...
Afișează indiciu

Separați order_totals și gold_users cu o virgulă (fără secundă WITH!)

Soluție disponibilă după 3 încercări

Exercițiu#sql.m14.l2.e2
Încercări: 0Se încarcă…

Acum să folosim mai multe CTE pentru a simplifica valorile: Creați „max_price” (extrage un singur rând cu „max_value” folosind „MAX(unit_price)” din „order_items”). În interogarea principală, extrageți fiecare „product_id” și „unit_price” din „order_items” și arătați cât de mult diferă de prețul maxim, calculând „(SELECT max_value FROM max_price) - unit_price AS difference”. No Join — utilizați o subinterogare pe CTE pentru a obține o singură valoare!

Se încarcă editorul...
Afișează indiciu

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

Soluție disponibilă după 3 încercări