İ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
- LinkedIn: Karcan Ozbal | LinkedIn
- Github: karcan (Karcan Ozbal) (github.com)
- Patreon: Karcan is creating little extensions for make your life funny :)
Konu istekleri ve makale ile ilgili tartışmak için yoruma bekliyorum.