Karcan Ozbal
2 min readApr 3, 2022

--

İleri Seviye SQL: CTE ile Sahte Veri Üretmek

# SQL’de CTL ile Sahte Veri Üretmek

Sorgu yazma pratikleri ve çeşitli ihtiyaçlar için sahte veri setlerine ihtiyaç duyarız. Bu makalede ise CTE ile sahte veri setlerini oluşturma mantığı üzerine yoğunlaşacağım.

WHILE vb. yöntemler ile bu ihtiyaçları tabii ki karşılayabiliriz ancak CTE ise daha düzenli ve okunabilir bir kod düzeni sağlar. Aynı zamanda CTE ile hazırlanan sorgular daha sürdürülebilir ve değiştirilebilir bir formda olur.

Peki, nedir bu CTE? : İleri Seviye SQL : CTE (Common Table Expressions)

# Yeni Bir Veritabanı ve Tablo Yapısının Oluşturulması

Kodları uyguladıktan sonra:

  • CTE_Merge isminde veritabanını,
  • dbo.FirstNames ve dbo.LastNames tablolarını,
  • dbo.FirstNames ve dbo.LastNames tablolarının her ikisine de 100 kayıt oluşturacağız.

# Yapılacak İşlemin Senaryosu

FirstNames ve LastNames tablolarından rastgele 100 kayıt alarak, 1000 adet ad ve soyada sahip kayıt oluşturulması işlemi.

# CTE ile 1000 Adet Ad ve Soyad Üretmek.

CTE ile senaryoya bağlı olarak istenilen işlemi gerçekleştirecek olursak;

Sorgudan bahsetmek gerekirse;

CTE_FirstName AS (

SELECT

TOP(100)

SortID = ROW_NUMBER() OVER(ORDER BY NEWID())

,[FirstName] = fn.FirstName

FROM

FirstNames AS fn

Yukarıdaki kod bloğunda, FirstNames tablosundaki 100 adet kayda ulaştık.

CTE_LastName AS (

SELECT

TOP(100)

SortID = ROW_NUMBER() OVER(ORDER BY NEWID())

,[LastName] = ln.FirstName

FROM

FirstNames AS ln

Yukarıdaki kod bloğunda, LastNames tablosundaki 100 adet kayda ulaştık.

CTE_Number AS (

SELECT

NUM = 1

UNION ALL

SELECT

NUM = NUM + 1

FROM

CTE_Number

WHERE

NUM < 1000

Yukarıdaki kod bloğunda, recursive olarak 1000 adet düzenli satır oluşturduk. bkz: İleri Seviye SQL: CTE ile Düzenli Satır Oluşturmak

CTE_Row AS(

SELECT

NameSortID = (ROW_NUMBER() OVER (ORDER BY NUM) — 1) % (SELECT COUNT(1) FROM CTE_FirstName) + 1

,LastnameSortID = (ROW_NUMBER() OVER (ORDER BY NUM) — 1) % (SELECT COUNT(1) FROM CTE_Lastname) + 1

,NUM

FROM

CTE_Number

)

Yukarıdaki kod bloğunda, CTE_Number bloğunda ürettiğimiz 1000 adet düzenli satır için, FirstNames ve LastNames tablolarına daha sonradan JOIN yöntemi ile rastgele bir kayda ulaşabilmek için NameSortID ve LastnameSortID kolonları yaratarak rastgele bir satır sıra numarası oluşturduk.

SELECT

[Order] = cter.NUM

,[FirstName] = ctefn.FirstName

,[LastName] = cteln.LastName

FROM

CTE_Row AS cter

LEFT JOIN CTE_FirstName AS ctefn ON ctefn.SortID = cter.NameSortID

LEFT JOIN CTE_Lastname AS cteln ON cteln.SortID = cter.LastnameSortID

ORDER BY NUM

OPTION(MAXRECURSION 0)

Yukarıdaki kod bloğunda ise, ürettiğimiz 1000 adet düzenli satır için NameSortID ve LastnameSortID kolonları ile birlikte ilk başta oluşturduğumuz FirstNames ve LastNames tablolarına JOIN yöntemi ile ulaşarak rastgele kayıtlara ulaşmış ve tamamen rastgele ad ve soyad değerleri üretmiş olduk.

Sonuca bakacak olursak;

Sahte veriler rastgele oluştuğundan çıktı sizlerde farklılık gösterebilir.

# Kazanımlar

  • CTE’nin tek bir DML ifadesi süresince var olduğunu ve genellikle recursive işlemlerde kullanıldığını,
  • View, temp table ve table-value constructora benzediğini ve alanların deklare edilmemesi gerektiğini,
  • Birden fazla CTE ifadesi kullanılabildiğini,
  • Recursive işlemlerde satır limitinin olduğunu,
  • CTE’nin Recursive ve birden fazla kullanımı ile rastgele sahte verileri üretmemizde yardımcı olduğunu öğrenmiş olduk.

# Sosyal Medya Hesaplarım

Konu istekleri ve makale ile ilgili tartışmak için yoruma bekliyorum.

--

--