Modulelessen (1/3)
Inleiding tot CTE's (MET)
Inleiding tot CTE's (MET)
Vroeg of laat overkomt het iedereen: je moet gegevens filteren op basis van het resultaat van een aggregatie, dan dat filter nemen en het samenvoegen met een andere geaggregeerde query. Je begint met het schrijven van een SELECT in een SELECT, die op zijn beurt terechtkomt in de FROM van nog een andere SELECT.
Het resultaat? Spaghetti SQL, een zoekopdracht die voor geen enkel mens leesbaar is.
Met CTE's (Common Table Expressions) kunt u deze puinhoop ontwarren. U activeert ze met het trefwoord WITH, waarmee u tijdelijke benoemde query's kunt definiëren en deze vervolgens kunt hergebruiken als 'virtuele tabellen' in de uiteindelijke query.
Basissyntaxis
WITH premium_customers AS (
SELECT customer_id, SUM(total_amount) AS total_spent
FROM orders
GROUP BY customer_id
HAVING SUM(total_amount) > 1000
)
SELECT customers.first_name, premium_customers.total_spent
FROM customers
JOIN premium_customers ON customers.id = premium_customers.customer_id;Zoals u kunt zien, leest de hoofdquery onderaan premium_customers alsof het een echte tabel is! En het is veel leesbaarder dan een mega inner-join met geneste subquery's.
Wij willen de zeer dure producten. Gebruik een CTE met de naam 'luxury_products' om 'id' en 'price' te selecteren uit 'products' waarbij 'price > 500' is. Voer vervolgens een hoofdquery uit op deze CTE en toon alles (*).
Toon hint
Begin met MET luxe_producten AS (...) en SELECTEER * UIT luxe_producten.
Oplossing beschikbaar na 3 pogingen
We willen gebruikers vinden die beoordelingen schrijven. Creëer een CTE 'reviewers' die de unieke (DISTINCT) 'customer_id'-waarden uit 'reviews' haalt. Extraheer vervolgens 'id', 'voornaam', 'achternaam' uit de tabel 'klanten' en \`JOIN\` met de CTE van de 'reviewers' op id.
Toon hint
MET reviewers AS (SELECTEER VERSCHILLENDE klant_id UIT beoordelingen) SELECTEER id, voornaam, achternaam VAN klanten WORD LID VAN reviewers OP customers.id = reviewers.customer_id;
Oplossing beschikbaar na 3 pogingen