CTE yani common table expressions Türkçe olarak ise ortak tablo ifadeleri ilk defa Microsoft SQL 2005 versiyonu ile karşımıza çıktı. CTE ile aslında sorgularımıza bir ön sorgu katabiliyoruz. Genelde çok ileri teknk sorgulamalarda kullanılan bir yapıdır. Basit sorgular için bir avantajı yoktur. Dolayısı ile ben çok fazla derinlemesine girmeden şimdilik yüzeysel olarak bu konudan bahsetmek istiyorum. Söz dizimi yani syntax olarak aşağıdaki gibi kullanımı mevcuttur :
WITH vermiş olduğumuz CTE adı AS (SELECT listelenecek kolonlar FROM tablo1) SELECT listelenecek kolonlar FROM tablo2 INNER JOIN vermiş olduğumuz CTE adı ON tablo2.kolon1 = vermiş olduğumuz CTE adı.kolon2
Şimdi bir örnek sorgu yapıp, sonucunu görelim : (AdventureWorks2012 veri tabanı üzerinde çalışıyorum)
WITH Siparisler AS (SELECT SalesOrderID, CustomerID FROM Sales.SalesOrderHeader) SELECT Musteri.CustomerID, Siparisler.SalesOrderID FROM Sales.Customer AS Musteri INNER JOIN Siparisler ON Musteri.CustomerID = Siparisler.CustomerID
Görüldüğü üzere sorgum WITH ile başlamaktadır. Daha sonra bir ifade ismi CTE tanımlıyoruz ve sonra sorgumuzun ilk kısmına geçiyoruz.
Sonuç :
Şimdi karmaşık bir sorgu ile başka bir örneğe devam edelim. Yapmış oldukları siparişleri ile birlikte yani siparişlerinin ID bilgileri ile birlikte bu siparişin hangi tarihte yapıldığını ve bu siparişi yapam müşterileri listelemeye çalışalım. Bunu diyagram olarak gösterirsek :
Sol taraftaki daire veritabanımızdaki Customer tablosu, sağ taraftaki daire ise CTE’miz.
Şimdi aşağıdaki sorguları ve sonuçlarını görelim.
SELECT Musteri.CustomerID, Satis.SalesOrderID, Satis.OrderDate FROM Sales.Customer AS Musteri LEFT OUTER JOIN Sales.SalesOrderHeader AS Satis ON Musteri.CustomerID = Satis.CustomerID WHERE Satis.OrderDate = '2007/04/01';
Bu sorgum sonucunda 85 satır bilgi dönüyor. Bu sorgum sonucunda NULL değerler listelenmiyor. NULL verileri de listelemek için CTE kullanıyoruz ve sorgumuz aşağıdaki gibi :
WITH Siparisler AS (SELECT SalesOrderID, CustomerID, OrderDate FROM Sales.SalesOrderHeader WHERE OrderDate = '2007/04/01') SELECT Musteri.CustomerID, Siparisler.SalesOrderID, Siparisler.OrderDate FROM Sales.Customer AS Musteri LEFT OUTER JOIN Siparisler ON Musteri.CustomerID = Siparisler.CustomerID ORDER BY Siparisler.OrderDate DESC;
1 Yorum
Pingback: Tablo İfadeleri | SQL Server Blog