close

什麼是OFFSET-FETCH?

簡單來說就是"分頁處理"功能

那什麼是"分頁處理"?而"分頁處理"可以運用在哪邊?跟過往處理有什麼差別?

分頁處理就是將查詢出來的資料集合加以分頁,並抽取當中的特定分頁資料。

舉例學生成績為例,假設一個年級有100名學生,我們想要根據學生考試的總成績進行排序

再以10名為一個區隔(分頁),將學生分成10等分。

老師可能會想要抽出指定的一個區隔內的資料出來查看是那些學生。

過往資訊人員在處理時一般有兩種做法,

  • 將100筆資料全都抓進ap端,再透過一些網頁技巧做到分頁效果

問題是100筆資料還好,當資料筆數越多時,取出過多不一定會用到的資料存DB端傳輸到AP端

會造成資源浪費以及佔據有效的頻寬,這種做法比較適合數據量較小的案例

  • 將100筆資料額外再添加欄位儲存排名序號,再取出指定序號的資料出來

這種作法改善了過多資料傳輸的問題,但相對的需要額外增加資料欄位或是使用更多的語法

可能會增加資料庫運算的負擔以及語法撰寫的難度

 

因此,SQL Server在2012版本出來時,終於提供了分頁功能來處理這方面的問題

http://technet.microsoft.com/zh-tw/library/gg699618(v=sql.110).aspx

語法其實滿簡潔乾淨的

-----------------------------------------------------------------------------------------

SELECT [資料欄位]

FROM [資料表]

ORDER BY [資料欄位]

OFFSET N ROWS(ROW)

FETCH NEXT(FIRST) M ROWS(ROW) ONLY

-----------------------------------------------------------------------------------------

在原本的語法後面(要有ORDER BY子句),加上OFFSET以及FETCH兩段(藍色為主要語法,紅色為可替換但沒差別)

OFFSET N ROWS:代表略過N筆開始(可以單獨使用不用加上FETCH子句)

FETCH NEXT M ROWS ONLY:代表取接下來M筆資料(一定要配合OFFSET子句使用)

範例

以學生考試成績為例

先隨機建立一百筆學生三科的成績

-----------------------------------------------------------------------------------------

IF OBJECT_ID('Score') is null
BEGIN
CREATE TABLE Score
(
  StudentID int primary key,
  E_Score int,
  C_Score int,
  M_Score int
)
DECLARE @CNT INT
SET @CNT=1
WHILE @CNT<=100
BEGIN
  INSERT INTO Score(StudentID,E_Score,C_Score,M_Score)
  VALUES (@CNT,CONVERT(int,40*RAND()+60),CONVERT(int,40*RAND()+60),CONVERT(int,40*RAND()+60))
SET @CNT=@CNT+1
END
END

-----------------------------------------------------------------------------------------

舉例

--根據三科總分進行排序,由大至小(DESC)
SELECT StudentID,E_Score,C_Score,M_Score,E_Score+C_Score+M_Score as Total
FROM Score
ORDER BY Total DESC
--跳過前10筆取後面的資料
SELECT StudentID,E_Score,C_Score,M_Score,E_Score+C_Score+M_Score as Total
FROM Score
ORDER BY Total DESC
OFFSET 10 ROWS
--跳過前10筆取接續10筆的資料
SELECT StudentID,E_Score,C_Score,M_Score,E_Score+C_Score+M_Score as Total
FROM Score
ORDER BY Total DESC
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY

 

由上面幾個簡單範例對於OFFSET-FETCH能有初步的了解

在撰寫程式時也可把10改成變數傳入來達到分頁處理的功能

arrow
arrow
    全站熱搜

    Louis 發表在 痞客邦 留言(0) 人氣()