Ara sonucu saklamak
Karmaşık raporlarda bir ara sonucu birden çok kez kullanmak gerekir. CTE yalnızca tek bir ifadede geçerlidir; birden çok sorguda kullanmak için geçici tablo gerekir.
| Tür | Yazım | Kapsam | Not |
|---|---|---|---|
| Yerel geçici tablo | #ad | Oturum | tempdb'de tutulur, indeks eklenebilir, istatistik tutar |
| Global geçici tablo | ##ad | Tüm oturumlar | Nadiren gerekir |
| Tablo değişkeni | DECLARE @ad TABLE (...) | Toplu iş (batch) | Küçük veriler için; istatistik tutmaz |
| CTE | WITH ad AS (...) | Tek ifade | Saklanmaz, okunabilirlik içindir |
SELECT ... INTO #tablo
DROP TABLE IF EXISTS #musteri_ciro;
SELECT o.customer_id,
SUM(oi.quantity * oi.unit_price * (1 - oi.discount)) AS ciro
INTO #musteri_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 TOP 5 c.first_name, c.last_name, ROUND(m.ciro, 2) AS ciro
FROM #musteri_ciro m
JOIN customers c ON c.customer_id = m.customer_id
ORDER BY m.ciro DESC;
SELECT ... INTO yeni_tablo, tabloyu sorgunun sütunlarıyla otomatik oluşturur ve doldurur. Kalıcı tablolar için de çalışır.
Önce tanımla, sonra doldur
CREATE TABLE #sehir_ozet (
sehir NVARCHAR(50),
musteri INT,
PRIMARY KEY (sehir)
);
INSERT INTO #sehir_ozet (sehir, musteri)
SELECT city, COUNT(*)
FROM customers
WHERE city IS NOT NULL
GROUP BY city;
SELECT * FROM #sehir_ozet WHERE musteri >= 10 ORDER BY musteri DESC;
Ne zaman hangisi?Birkaç yüz satır ve tek kullanım: tablo değişkeni veya CTE. Binlerce satır, birden çok sorguda kullanım veya indeks ihtiyacı:
#temp.