CTE’leri Kullanmak – Bölüm 38

SQL Server’da bulunan başka bir tablo biçimi CTE (common table expression)’dir. Türetilmiş tablolar gibi CTE’lerle de sorguda daha sonra başka bir yerde kullanılabilecek bir alt sorguyu tanımlanabilir. Türetilmiş tablolanun aksine, CTE sorgunun başında tanımlanır ve dış sorguda birçok kez referansla kullanılabilir.

CTE’lerle Sorgu Yazma

CTE’ler, sorguda tanımlanan adlandırılmış ifadelerdir. Alt sorgular ve türetilmiş tablolar gibi CTE’ler kullanmak da sorgu sorunlarını daha küçük, daha modüler birimlere bölmenin bir yoludur. CTE’lerle sorgu yazarken aşağıdakileri göz önünde bulundurmakta fayda var:

  • Türetilmiş tablolar gibi CTE’lerin çalışması da dış sorguya bağlıdır. Dış sorgu sona erdiğinde CTE’nin de ömrü sona erer.
  • CTE’nin SELECT ifadesindeki sütunların her biri için ve ayrıca tablo ifadesi için de isim gerektirir.
  • CTE’lerde sütunlara satır içi veya harici yolla takma adlar tanımlanabilir.
  • Türetilmiş tabloların aksine, bir CTE aynı sorguda bir tanımla birçok kez kullanılabilir. Aynı WITH deyiminde birden çok CTE de tanımlanabilir.
  • CTE’ler, ifadenin kendi içerisinde tanımlandığı tekrarlı işlemi destekler. Tekrarlı CTE’ler bu bölümün kapsamı dışındadır.

Tekrarlı CTE’ler hakkında SQL Server Teknik Dökümanları’na göz atabilirsiniz: Recursive Queries Using Common Table Expressions

CTE’ler ile Sorgu Oluşturma

Sorguda CTE oluşturmak için syntax’ta olduğu gibi WITH ifadesinde tanımlanır:

WITH <CTE_name>
AS ( <CTE_definition> ) 

Örneğin CTE kullanmak için yazılan sorgu, türetilmiş tabloları göstermek için de kullanılabilir:

WITH CTE_year --CTE ismi
AS -- alt sorgu tanımı
(
 SELECT YEAR(orderdate) AS orderyear, custid
 FROM Sales.Orders
)
SELECT orderyear, COUNT(DISTINCT custid) AS cust_count
FROM CTE_year --CTE'nin dış sorguda kullanılması
GROUP BY orderyear; 

Sonuçlar:

orderyearcust_count
200667
200786
200881

(3 row(s) affected)

Kaynak:
WITH common_table_expression (Transact-SQL)

Leave a Reply

Your email address will not be published. Required fields are marked *