Pelajaran modul (2/3)
CTE ganda dan berantai
CTE Berganda dan Berantai
Keanggunan ekspresi WITH benar-benar terpancar saat Anda menyatukan beberapa ekspresi. Anda dapat menentukan banyak CTE secara berurutan, memisahkannya dengan koma.
Dan inilah sesuatu yang disukai oleh para penganut refactoring: CTE yang lebih baru dapat membaca data dari CTE yang lebih awal, membongkar perhitungan sekuensial sepotong demi sepotong!
Contoh 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;Ini adalah pemrograman bergaya blok! Setiap blok hanya melakukan satu pekerjaan.
Tentukan dua CTE berurutan: \n1) 'order_totals' menghitung 'customer_id' dan 'order_count' yang ditempatkan menggunakan `COUNT(*)` dari 'orders'.\n2) 'gold_users' membaca dari 'order_totals' yang memfilter pelanggan dengan 'order_count >= 2'.\nAkhirnya GABUNG ke tabel 'customers' (mengekstrak 'first_name' dan 'last_name') dengan 'gold_users' (ON c.id = g.customer_id), dan tampilkan juga 'order_count' mereka.
Tunjukkan petunjuk
Pisahkan order_totals dan gold_users dengan koma (tidak ada detik DENGAN!)
Solusi tersedia setelah 3 upaya
Sekarang mari kita gunakan beberapa CTE untuk menyederhanakan metrik: Buat 'max_price' (ekstraksi satu baris dengan 'max_value' menggunakan `MAX(unit_price)` dari 'order_items'). Dalam kueri utama, ekstrak setiap 'id_produk' dan 'harga_unit' dari 'barang_pesanan' dan tunjukkan seberapa besar perbedaannya dari harga maksimum, dengan menghitung '(SELECT max_value FROM max_price) - perbedaan unit_price AS'. No Join — gunakan subquery pada CTE untuk mendapatkan satu nilai!
Tunjukkan petunjuk
DENGAN max_price AS (...) PILIH product_id, unit_price, (PILIH max_value DARI max_price) - unit_price DARI order_items;
Solusi tersedia setelah 3 upaya