Modül dersleri (1/3)
CTE'lere Giriş (ILE)
CTE'lere Giriş (ILE)
Er ya da geç bu herkesin başına gelir: Verileri bir toplamanın sonucuna göre filtrelemeniz, ardından bu filtreyi alıp onu başka bir toplu sorguyla BİRLEŞTİRMENİZ gerekir. SELECT içine SELECT yazmaya başlarsınız, bu da başka bir SELECT'nin FROM'sinde son bulur.
Sonuç? Spagetti SQL, hiçbir insan tarafından okunamayan bir sorgu.
CTE'ler (Ortak Tablo İfadeleri) bu karışıklığı çözmenize olanak tanır. Bunları, geçici adlandırılmış sorguları tanımlamanıza ve ardından bunları son sorguda "sanal tablolar" olarak yeniden kullanmanıza olanak tanıyan WITH anahtar sözcüğüyle etkinleştirirsiniz.
Temel Söz Dizimi
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;Gördüğünüz gibi, alttaki ana sorgu sanki gerçek bir tabloymuş gibi premium_customers değerini okuyor! Ve iç içe geçmiş alt sorgulara sahip mega iç birleştirmeden çok daha okunabilir.
Çok pahalı ürünleri istiyoruz. 'Fiyat > 500' olan 'ürünler'den 'kimlik' ve 'fiyat'ı seçmek için 'lüks_ürünler' adlı bir CTE kullanın. Daha sonra bu CTE'de bir ana sorgu çalıştırın ve her şeyi gösterin (*).
İpucu göster
İLE lüks_ürünler AS (...) ile başlayın ve ardından lüks_ürünlerden SELECT * FROM'u seçin.
3 denemeden sonra çözüm mevcut
Yorum yazan kullanıcıları bulmak istiyoruz. 'İncelemelerden' benzersiz (DISTINCT) 'customer_id' değerlerini çıkaran bir CTE 'inceleyenler' oluşturun. Daha sonra 'müşteriler' tablosundan 'id', 'first_name', 'last_name' bilgilerini çıkarın ve kimlikteki 'inceleyenlerin' CTE'si ile \`JOIN\` yapın.
İpucu göster
İnceleyenler İLE (incelemelerden DISTINCT customer_id SEÇİN) Müşterilerden kimliği, adı, soyadını SEÇİN incelemecilere ONDAN KATILIN customer.id = reviewers.customer_id;
3 denemeden sonra çözüm mevcut