Direct naar de hoofdinhoud
Module 14 · Les 2 van 354/57 in de cursus~15 min
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

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;

Het is programmeren in blokstijl! Elk blok doet slechts één taak.

Oefening#sql.m14.l2.e1
Pogingen: 0Laden…

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'.

Editor laden…
Toon hint

Scheid order_totalen en goud_gebruikers met een komma (geen seconde MET!)

Oplossing beschikbaar na 3 pogingen

Oefening#sql.m14.l2.e2
Pogingen: 0Laden…

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!

Editor laden…
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