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
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ă.
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.
Afișează indiciu
Separați order_totals și gold_users cu o virgulă (fără secundă WITH!)
Soluție disponibilă după 3 încercări
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!
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