Ana içeriğe geç
Kesit SQL
Orta · T-SQL (SQL Server)

Geçici tablolar, tablo değişkenleri ve SELECT INTO

#temp, ##global, @tablo ve ara sonuçları saklamak.

Uygulamada aç, 3 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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ürYazımKapsamNot
Yerel geçici tablo#adOturumtempdb'de tutulur, indeks eklenebilir, istatistik tutar
Global geçici tablo##adTüm oturumlarNadiren gerekir
Tablo değişkeniDECLARE @ad TABLE (...)Toplu iş (batch)Küçük veriler için; istatistik tutmaz
CTEWITH ad AS (...)Tek ifadeSaklanmaz, 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.
Alıştırmalara geç (3)