Transact SQL – Select Sorgusunda Kullanılan Kolonu Gizleme Yöntemi

Merhaba,

Bu içeriğimizde, Select sorgusu neticesinde kullanılan kolonu gizlemeyi inceleyeceğiz. Konuya ilk olarak vereceğinizi tahmin ettiğim ‘hoca kolonları çağırmasanda kullanabilirsin‘ şeklinde olan tepkinize bir cevap vererek girmek istiyorum.

Evet…

Select X from Tablo Where Y = 1

Bende bu yukarıdaki yaklaşımın çalıştığını, illa çektiğimiz kolonlar üzerinde işlem yapmamız gerekmediğini biliyorum.

Hatta buyrun, direkt somut bir örnekle olayı ele alalım.
Transact SQL - Select Sorgusunda Kullanılan Kolonu Gizleme Yöntemi

Eee? Durduk yere komplekse girip bildiğimi ıspatlarcasına bir naz edasıyla bu içeriği paylaşıp makalemizi burada bitireceğimi düşünmüyorsunuzdur herhalde 🙂 Tabi ki de vurgulamak isteyeceğim, size çok çok uzak olan hatta çooook nadir yaşanacak bir ihtiyaç durumunda bu yöntemin ansızın lazım olabileceği bir ahval üzerine size konuyu kurgulayacak ve asıl sadedi içeriğin son paragraflarına dökeceğim.

Birazdan asıl konumuza gelmek üzere T-SQL yapılarında kullandığımız farklı durumlardan bir kaçını masaya yatıralım. Şimdi iyi takip ediniz…

Hani bir select sorgusundan dönen sonucu bir başka select sorgusunda şart, tablo vs. olarak kullanıyoruz ya… Heh işte.. Şimdi gelin bu durumları tekrardan anımsayalım.

Select * from Personeller Where PersonelID = (Select PersonelID from Satislar Where SatisID = 10255)

Görüldüğü üzere burada Where şartında Satislar tablosundan dönen bir başka sonucu kullanmaktayız. Hatırlarsanız buradaki tek şartımız Where komutunda kullandığımız tablonun bize tek satır veri döndürmesidir. Hatırladınız mı? Hatta aslen bu yönteme Subquery(Altsorgu) dediğimizide ve inner join yapılarındaki mantığın aynısını farklı yöntemle çalıştığımızı hatırlatırım.

Velhasıl bir başka örneğe bakalım.

Select s.* from (Select * from Satislar) s

Burada da select sorgusu sonucu gelen tabloyu bir başka select sorgusunda kullanmaktayız. Hadi bir ek hatırlatma daha vereyim. Burada da Subquery olan sorgumuza alias atamak şartıyla işlem gerçekleştirebilmekteyiz.

Şimdi de bambaşka bir konuyu ele alalım. ROW_NUMBER() fonksiyonunu. Bu fonksiyon kullanıldığı tabloda kullanıldığı kolona özel index numarası oluşturmaktadır. Ayriyetten gruplama yaparak indexleme yapabilmekte yahut sıralama … falan filan… Fonksiyonla ilgili detaylar ilgili adreste zaten mevcut. Şimdi bu ROW_NUMBER foksiyonunun kullanıldığı aşağıdaki örneği inceleyiniz.

Update Personeller Set Adi = 'Hilmi' Where PersonelID = 
(
	Select IndexliTablo.PersonelID from 
	(
		Select ROW_NUMBER() OVER(order by Unvan) indexer, PersonelID from Personeller
	) IndexliTablo Where IndexliTablo.indexer = 3
)

Burada bir senaryo yaratabilmek için özellikle ROW_NUMBER fonksiyonunu seçtim. Dikkat ederseniz yapılacak güncelleme işleminde PersonelID şartında subquery kullanılmakta. En içteki subquerye bakarsanız eğer bir ihtiyaçtan ötürü ROW_NUMBER fonksiyonu ile index kolonu oluşturmuş ve ilgili kolonla birlikte PersonelID kolonunu listelemiştir. Eee haliyle bu subquery geriye tek satır ve tek sütun dönemeyeceği için haliyle bu sorguyu kapsayan bir başka subquery oluşturulmuş ve ondan sadece belirli bir şarta göre(‘IndexliTablo.indexer = 3′ ki buradaki şart sonucu tek satır ve tek sütun olarak dönmesi için bir mantığa dayanmaksızın örnek olarak yazılmıştır’) PersonelID değeri döndürülmüştür.

Şimdi düşünelim. En içteki subqueryde çağırmasakta index kolonuna ulaşabilir miydik? Hayır. Çünkü öyle bir kolon fiziksel tabloda bulunmamaktadır. ROW_NUMBER fonksiyonu ile oluşturulmuştur. Eee haliyle mecburi sorguda yer etmesede lazım iken kullanamayacağımız, amma var iken de işimizi engelleyen bu tarz bir senaryoda görüldüğü üzere indexer kolonu gizlenmiştir. Ve ancak bu şekilde gizlenirse kullanılabilmektedir.

İşte… Bu tarz uzak ve karşılaşılabilitesi oldukça düşük olan bir senaryoda görüldüğü üzere sizin içeriğe ilk başlarda ‘hoca kolonları çağırmasanda kullanabilirsin‘ şeklinde yapmış olduğunuz çıkışa karşılık her zaman haklı olmadığınızı göstermiş olmaktan ve lazım olursa da herşeye rağmen imdadınıza yetişecek bir çözüm sunmaktan son derece haz aldığımı söylemek isterim. 🙂

Neyse…

Hadi şimdi gelin son sözü beraber söyleyelim.

Select t.Kolon1 from 
(
	Select Kolon1, Kolon2 from Tablo
) t

İşte bu yöntem, her daim çok mantıklı bir yaklaşım sunmasada, aslında gizli bir can kurtaran ve derin algoritmik sorgular oluşturmamızı sağlayan Design Pattern’dir diyebiliriz. Hayır hayır… Böyle kabul edilmiyor 🙂 ama bundan sonra bu tarz durumlarda kullanılabilecek nadir T-SQL yaklaşımsal yöntemi olacağından dolayı, bu tekrara nispeten bu yönteme ben Design Pattern ünvanını bu makalede veriyorum. 🙂 Vatana millete hayırlı olsun… 😀

Peki dostlar…
Daha fazla uzatacak birşey kalmadı sanırım 🙂

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*