Olusturdugumuz sorgularda neredeyse hepimiz where ve order by gibi kisimlarda kolon alias larini kullanmaya çalismisizdir. Where cümlesi içinde kullanmak istedigimiz de hata alirken order by içinde kullandigimiz da hata almiyoruz. Peki bunun nedeni nedir?
Ilk olarak iki örnekle olayi anlatmaya çalisayim.
Where içinde Alias kullanmak:
select name as ObjeAdi, YEAR(create_date) as YIL, create_date as OlusturmaTarihi from sys.objects where YIL = 2012
Yukaridaki sorguyu çalistirdiginiz zaman “Invalid column name ‘YIL’.” hatasi alirsiniz.
Order by Içinde Kullanimi :
select name as ObjeAdi, YEAR(create_date) as YIL, create_date as OlusturmaTarihi from sys.objects order by YIL desc
Yukaridaki sorguyu ise herhangi bir hata almadan çalistirabilirsiniz. Peki bunun sebebi nedir ?
SQL Server bir sorguyu islerken belirli bir siraya göre islem yapar. Bu sira genel hatlari ile su sekildedir. FROM -> ON -> WHERE -> SELECT -> ORDER BY
Sizin tanimladiginiz YIl alias i select içinde tanimlandigi ve WHERE kismi SQL de SELECT’ten önce çalistigi için, WHERE kismi çalisirken SQL engine daha YIL adindaki aliasin ne oldugunu bilmemekte. Bu yüzden de invalid column name hatasi vermekte.
ORDER BY ise SELECT’ten sonra çalistigi için bu kisimda artik YIl aliasi SQL engine tarafindan taninmaktadir. Buda hata almadan sorgumuzun tamamlanmasini saglamaktadir.
bu ?ekilde çaly?masy beklenir zaten, inner select kullanyldynda, bu veriyi tempdb ye yazarak onu yeni bir virtual table olarak kullanyr. burda dikkat etmeniz gereken where YIL = 2012 filtresini dy?ary yazdy?ynyzda performansy ne kadar etkileyece?idir. Bunu milyar satyrlyk bir tabloda denerseniz biraz sykynty ya?ayabilirsiniz.