Modulelessen (2/3)
Meerdere en geketende CTE's
Meerdere en gekoppelde CTE's
De elegantie van WITH-uitdrukkingen komt pas echt tot zijn recht als je er meerdere aan elkaar koppelt. U kunt meerdere CTE's achter elkaar definiëren, gescheiden door een komma.
En hier is iets waar puristen van refactoring dol op zijn: latere CTE's kunnen gegevens van eerdere CTE's lezen, waardoor opeenvolgende berekeningen stukje bij beetje worden uitgepakt!
Multi-CTE-voorbeeld
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;Het is programmeren in blokstijl! Elk blok doet slechts één taak.
Definieer twee opeenvolgende CTE's: \n1) 'order_totals' berekent 'customer_id' en de 'order_count' geplaatst met `COUNT(*)` uit 'orders'.\n2) 'gold_users' leest uit 'order_totals' en filtert klanten met 'order_count >= 2'.\nWord tenslotte lid van de tabel 'customers' (waarbij 'voornaam' en 'achternaam' worden geëxtraheerd) met 'gold_users' (ON c.id = g.customer_id), en tonen ook hun 'order_count'.
Toon hint
Scheid order_totalen en goud_gebruikers met een komma (geen seconde MET!)
Oplossing beschikbaar na 3 pogingen
Laten we nu meerdere CTE's gebruiken om de statistieken te vereenvoudigen: Maak 'max_price' (extraheert een enkele rij met 'max_value' met behulp van 'MAX(unit_price)' uit 'order_items'). Extraheer in de hoofdquery elke 'product_id' en 'unit_price' uit 'order_items' en laat zien hoeveel deze verschilt van de maximumprijs, waarbij '(SELECT max_value FROM max_price) - unit_price AS Difference' wordt berekend. Geen deelname: gebruik een subquery op de CTE om één enkele waarde te verkrijgen!
Toon hint
MET max_price AS (...) SELECT product_id, unit_price, (SELECT max_value FROM max_price) - unit_price FROM order_items;
Oplossing beschikbaar na 3 pogingen