February 9, 2007
@ 04:12 AM

En son öğrencilerimiz ile kurs sonrası tekrar buluşup sohbet esnasında  "neden ms sql de mySql'deki LIMIT gibi birşey yok.. olması lazım" içerikli konuşmaya kulak kabartmıştım. Tabi bilenler hemen MsSQL 2005 de bu iş için ROW_NUMBER anahtar kelimesinin geldiğini bunla paging - sayfalama - yapılabildiğini söylediler. Ama birçok kişinin hala benzer problemler yaşadığını görüp işitiyoruz. Projemiz hala MsSql 2000 üzerinde ise ne yapabiliriz ? Tabi gecici tablolardan tutun da SP ler yazarak değişik çözümler üretmek mümküm. Ama bir yöntem var ki cidden çok tatlı ve zekice.


Diyelim ki her sayfada 50 eleman göstermek istiyorsunuz. Buna PS dielim ki bu herzaman sabit kalacaktır.Sürekli değişen ise kaçıncı PS den itibaren PS kadar kayıt alacağınız. Buna da OS dersek;


Select Top PS * from TblHede where tblHede.ID not in ( select TOP OS TblHede.ID from TblHede)   gibi bir sorgu işimizi görecektir.



Eğer ilk PS kaydi almak istiyorsak OS = 0, ikinci PS i almak istiyorsak OS = PS * 2 şeklinde ... OS = PS *n şeklinde OS'a değerler vererek sayfalama yaptırabiliriz.(PS in 50 olduğunu düşünürsek, OS ; 0, 50, 100... şeklinde artacaktır)

içerdeki sorgu (select top os ....) bir imleç olarak ya da indeks olarak düşünürsek, OS = 50 dediğimizde; tblHede tablosundaki ilk 50 kayıt dışındaki - not in  sayesinde - kayıtlardan ilk 50 kayıtı al demiş oluyoruz. OS  = 100 dediğimizde de tblHede tablosundaki ilk 100 kayıt dışında kalan kayıtlardan ilk 50 tanesini getir demiş oluruz ki burda PS'in değişmediğine değişenin OS olduğuna dikkat etmemiz gerekir.



Büyük datalarda ne kadar efektif sonuç üretir tartışılır :)