← Back to list

SQL’de Geçici Tablolar ve Dinamik Sorgular- Basit Bir Örnek

Veri tabanı üzerinde sorgular hazırlarken bir sorgunun çıktısını başka bir sorguya girdi olarak kullanmam gerektiğinde genellikle bir excel…

Seliskacmaz · 2024-03-22 23:43 · 0 claps · 3.3 min read
#sql #query #dynamic-query #sorgu #verianalizi
Open on Medium ↗

SQL’de Geçici Tablolar ve Dinamik Sorgular- Basit Bir Örnek

Veri tabanı üzerinde sorgular hazırlarken bir sorgunun çıktısını başka bir sorguya girdi olarak kullanmam gerektiğinde genellikle bir excel sayfasına atıp formüller ile sorguya uygun bir formata dönüştürüp sorgumu öyle hazırlıyordum. Bu işleme gerek kalmadan sql üzerinde ilgili sorguların hazırlanabileceğini öğrendim. Basit bir örnek üzerinden gidelim

Elimizde iki adet tablo olsun. Bunlar Kullanıcılar ve Gönderiler. Bir web sitesi üzerindeki kullanıcı bilgileri ve bu kullanıcıların gönderilerinin tutulduğu tablolar. Normalde bu tabloların ortak bir alanla örneğin Gönderiler tablosunda bulunacak olan bir kullanıcı id bilgisi ile ilişkisi olması gerekir ama örneğimizi anlamak için öyle olmadığını ve kullanıcı adı ile text bir şekilde ortak bir alanla ilişkinin kurulabildiğini düşünelim. Örneği deneyebilmeniz için tabloların create scripti aşağıdaki gibidir.

CREATE TABLE Kullanicilar (
    KullaniciID INT PRIMARY KEY,
    KullaniciAdi NVARCHAR(50),
    Email NVARCHAR(100),
    Sehir NVARCHAR(50) 
);

INSERT INTO Kullanicilar (KullaniciID, KullaniciAdi, Email, Sehir) VALUES
(1, 'ahmet35', 'ahmet35@example.com', 'İstanbul'),
(2, 'mehmet_54', 'mehmet_54@example.com', 'Ankara'),
(3, 'ayse123', 'ayse123@example.com', 'İstanbul'),
(4, 'ali78', 'ali78@example.com', 'Bursa'),
(5, 'elif_19', 'elif_19@example.com', 'Adana');

CREATE TABLE Gonderiler (
    GonderiID INT PRIMARY KEY,
    Baslik NVARCHAR(100),
    Icerik NVARCHAR(MAX),
    Yazar NVARCHAR(50)  -- Kullanıcı adını içeren bir alan
);

INSERT INTO Gonderiler (GonderiID, Baslik, Icerik, Yazar) VALUES
(1, 'Yazılım Geliştirme İpuçları', 'Yazılım geliştirme sürecinde dikkat edilmesi gereken bazı ipuçları...', 'ahmet35'),
(2, 'Yeni Teknoloji Trendleri', 'Yapay zeka, blokzincir teknolojisi ve nesnelerin interneti gibi yeni trendler...', 'mehmet_54'),
(3, 'Sağlıklı Beslenme Önerileri', 'Dengeli ve sağlıklı bir beslenme için günlük olarak tüketilmesi gereken besinler...', 'ayse123'),
(4, 'Gezi Rehberi: İstanbul', 'İstanbuldaki en popüler turistik yerler ve gezilecek mekanlar hakkında bilgiler...', 'ali78'),
(5, 'Spor Haberleri', 'Güncel spor haberleri, futbol maçlarının skorları ve spor dünyasındaki son gelişmeler...', 'elif_19'),
(6, 'Güvenli İnternet Kullanımı İpuçları', 'İnternet üzerindeki güvenlik risklerini azaltmanın yolları ve önemli ipuçları...', 'ahmet35'),
(7, 'Geleceğin Teknolojileri', 'Gelecekte hayatımızı değiştirecek teknolojiler ve inovasyonun önemi hakkında bilgiler...', 'mehmet_54'),
(8, 'Diyet ve Egzersiz Önerileri', 'Diyet programları ve düzenli egzersizin vücuda olan etkileri hakkında sağlıklı bilgiler...', 'ayse123'),
(9, 'Hafta Sonu Kaçamağı: Bodrum', 'Bodrumdaki en güzel plajlar, restoranlar ve eğlence mekanları hakkında rehber bilgiler...', 'ali78'),
(10, 'Basketbol Haberleri', 'NBA ve EuroLeague gibi liglerdeki son maç sonuçları ve transfer haberleri...', 'elif_19'),
(11, 'Web Geliştirme İpuçları', 'Web geliştirme sürecinde kullanılabilecek pratik yöntemler ve kaynaklar hakkında öneriler...', 'ahmet35'),
(12, 'Yapay Zeka ve İnsanlık', 'Yapay zeka teknolojisinin insanlık üzerindeki etkileri ve gelecekteki potansiyeli...', 'mehmet_54'),
(13, 'Sağlıklı Beslenme ve Diyet', 'Dengeli beslenme ve sağlıklı yaşam için günlük besin ihtiyaçları hakkında öneriler...', 'ayse123'),
(14, 'Gezi Rehberi: Kapadokya', 'Kapadokyadaki tarihi ve doğal güzellikler, balon turları ve konaklama seçenekleri hakkında bilgiler...', 'ali78'),
(15, 'Futbol Haberleri', 'Türkiye Süper Lig ve Avrupa liglerindeki son maç skorları ve transfer dedikoduları...', 'elif_19');

Görüldüğü gibi tablolarımız Kullanicilar tablosundaki KullaniciAdi ve Gonderiler tablosundaki Yazar alanıyla birbiri ile ilişkili. Bu iki alanda text formatında alanlar.

İstanbul’da yaşayan kullanıcıların gönderdiği gönderileri sorgulamak istediğimizi düşünelim. Dinamik sorgu mantığını kullanmadan önce izlediğim adımlar şu şekildeydi.

SELECT *

FROM [deneme].[dbo].[Kullanicilar]

where Sehir = ‘İstanbul’ kodu ile İstanbul’da yaşayan kullanıcı bilgilerini getirir. Sonuç tablosu bana KullaniciAdi değerini getirdi ama bu şekli ile Gonderiler tablosunda bu değeri sorgulayamam.

Excel formüllerini kullanarak burdaki KullaniciAdi değerlerini uygun formata getirebiliriz. Örneğin ahmet35 değerini ‘ahmet35’ şekline getirelim. Sonra bu şekli ile sorgumuzda aşağıdaki gibi Gönderiler tablosunda sorgulayabiliriz.

SELECT *
  FROM [deneme].[dbo].[Gonderiler]
  where Yazar in (
'ahmet35',
'ayse123'
  )

Dinamik Sorgu Oluşturma

Yukarıdaki yöntem yerine farklı bir yöntemle ilerleyelim.

--Değişkenlerin tanımlanması
DECLARE @kullanici NVARCHAR(MAX)
DECLARE @dinamiksorgu NVARCHAR(MAX)

--Kullanıcıları bulma ve formatlama ve dizeleme
select @kullanici = COALESCE(@kullanici + ', ', '') + QUOTENAME(KullaniciAdi, '''')
FROM (SELECT KullaniciAdi FROM Kullanicilar where Sehir = 'İstanbul') AS Kullanici

select @kullanici

-- Dinamik sorguyu oluşturma
SET @dinamikSorgu ='SELECT * FROM Gonderiler where Yazar in  (' + @kullanici + ')'

select @dinamikSorgu

-- Dinamik sorguyu çalıştırma
EXEC sp_executesql @dinamikSorgu

Yukarıdaki gibi gerekli char formatında değişkenlerimizi tanımlayıp formatlama işlemini sql fonksiyonları aracı ile gerçekleştirip ilgili sorguyu text formatında oluşturabiliriz. COALESCE kodu burda bir dize oluşturma için QUOTENAME kodu ise formatlama için kullanılmıştır.

Sonucunda da EXEC sp_executesql komutu ile kodumuzu çalıştırabiliriz.

Geçici Tablo Oluşturarak Sorgulama

Bu sefer geçici tablo oluşturarak ilerleyelim.

-- Geçici tablo oluşturma ve sınıf değerlerini geçici tabloya aktarma
CREATE TABLE #TempKullanici (
Kullanici NVARCHAR(20)
)

INSERT INTO #TempKullanici (Kullanici)
SELECT KullaniciAdi FROM Kullanicilar where Sehir = 'İstanbul'

SELECT * FROM #TempKullanici

--Gönderiler tablosundan ilgili kullanıcı değerlerini sorgulama
SELECT *FROM Gonderiler 
WHERE Yazar IN (SELECT Kullanici FROM #TempKullanici)

-- Geçici tabloyu temizleme
DROP TABLE #TempKullanici

Yukarıdaki gibi sql üzerinde #TempKullanici adı ile geçici bir tablo oluşturabiliriz. Bu tablo veri tabanı üzerinde açılmayacak bir tablo olup session bittiği zaman silinecek bir tablodur. Geçici tabloları tablo adının başına # koyarak oluşturabiliriz.

Daha sonra bu tablomuza Kullanicilar tablosundaki değerleri insert edebilir ve Gonderiler tablomuz üzerinde bu değerleri sorgu ile aratabiliriz.

Küçük veri setleri üzerince 3 farklı yöntemde zaman olarak bir fark sağlamayacaktır ama veri setleri büyüdükçe dinamik sorgu ya da temp tablo kullanımı zaman ve maliyet açısından daha kullanışlı olabilir.


메타데이터
post_id
bc77f0f8e9be
slug
sqlde-geçici-tablolar-ve-dinamik-sorgular-basit-bir-örnek-bc77f0f8e9be
url
https://medium.com/@seliskacmaz1/sqlde-ge%C3%A7ici-tablolar-ve-dinamik-sorgular-basit-bir-%C3%B6rnek-bc77f0f8e9be
canonical_url
https://medium.com/@seliskacmaz1/sqlde-ge%C3%A7ici-tablolar-ve-dinamik-sorgular-basit-bir-%C3%B6rnek-bc77f0f8e9be
author_url
https://medium.com/@seliskacmaz1
status
ok
fetched_at
2026-07-24 05:01:32