Common Table Expression
CTE, sorgunun başında WITH ile tanımlanan, isim verilmiş geçici bir sonuç kümesidir. İç içe alt sorgular yerine yukarıdan aşağı okunan adımlar yazmanı sağlar.
WITH musteri_ciro AS (
SELECT o.customer_id,
SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
FROM orders o
JOIN order_items oi ON oi.order_id = o.order_id
WHERE o.status = 'delivered'
GROUP BY o.customer_id
)
SELECT c.first_name, c.last_name, ROUND(mc.ciro, 2) AS ciro
FROM musteri_ciro mc
JOIN customers c ON c.customer_id = mc.customer_id
ORDER BY mc.ciro DESC
LIMIT 5;
Birden fazla CTE
Virgülle ayrılır; sonraki CTE öncekileri kullanabilir:
WITH aylik AS (
SELECT strftime('%Y-%m', o.order_date) AS ay,
SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
FROM orders o JOIN order_items oi ON oi.order_id = o.order_id
WHERE o.status = 'delivered'
GROUP BY ay
),
ortalama AS (
SELECT AVG(ciro) AS ort FROM aylik
)
SELECT a.ay, ROUND(a.ciro) AS ciro
FROM aylik a, ortalama
WHERE a.ciro > ortalama.ort
ORDER BY a.ay;
Ne zaman CTE?Aynı alt sonucu birden çok kez kullanacaksan, sorgu üç seviyeden fazla iç içe geçiyorsa veya başkası okuyacaksa. Analist ekiplerinde CTE ile yazmak neredeyse standarttır.
Derinleş: CTE ile adım adım doğrulama
CTE'nin en büyük faydası her adımı ayrı ayrı çalıştırabilmendir. Uzun bir sorgu yazarken son SELECT'i geçici olarak SELECT * FROM adim2 LIMIT 10 yap; her adımın çıktısının beklediğin taneciğe sahip olduğunu gör, sonra bir sonraki adıma geç. Bu alışkanlık mülakatta da, iş hayatında da hataların çoğunu erkenden yakalar.