2008/08/05

MSDN教的分頁

之前就講過分頁的SQL怎樣下了,連結如下:
http://tomkentprogramming.blogspot.com/2006/07/sql.html#links

但是其實各人覺得這個真的有點浪費資源,每換頁一次就要再搬動整個資料庫。
於是上網找了一些資料。
發現,MYSQL竟然可以有LIMIT X,Y這玩意,
也就是將SQL COMMAND裡面第X列到第Y列直接抓出來。
就是這麼簡單。
範例:
select * from member
limit 10,20

就是這樣簡單也。
於是我心想,SQL SERVER是否也有,發現好像不行。

找了微軟的MSDN竟然找到一些奇怪的方式,在此也提供給大家。
像是rank這玩意,MSDN上的作法真的讓我匪夷所思,
MSDN的網址:
http://support.microsoft.com/kb/186133/zh-tw
MSDN的範例:【rank】
select rank=count(*) ,tb1.memNo , tb1.memName
from member as tb1, member as tb2
where tb1.memNo >= tb2.memNo group by tb1.memNo , tb1.memName order by rank
他這個作法真的是慢到誇張。建議不要使用,不過聽說SQL SERVER2000只能這樣,
如果是這樣,到不如用我之前那個寫法,會快很多,只是每次都要搬動整個資料庫。

於是我又發現了另一個好玩的東西:【row_number】
這個事SQL SERVER2005才有的東西,不過速度快很多。
讓我整個很愛...
MSDN的網址:
http://msdn.microsoft.com/zh-tw/library/ms186734.aspx
語法如下:
ROW_NUMBER ( ) OVER ( [ ] )
範例:
with memberIwant as
(
select row_number over (order by memNo) as rowNum, memNo, memName
form member
where memAge=20
)
select * from memberIwant
where rowNum between 20 and 30