2012-02-22 52 views
3

我需要使用分頁讀取MS SQL數據庫表的內容,即獲取N行的第一頁,然後獲取N行的第二頁等等。關於快速更改數據庫內容的分頁

如果數據庫的內容分頁期間顯著改變,是一個簡單的分頁查詢:

SELECT * 
FROM (SELECT a.*, 
    ROW_NUMBER() OVER (ORDER BY id) AS rnum 
    FROM articles a) 
WHERE rnum <= 10 
AND rnum >= 6; 

可能無法可靠地工作。插入的行可以跳過,或者可能導致後續行重複,刪除的行可能導致後續行被跳過。整個分頁中

  1. 鎖定對更新行 - 太 限制性
  2. 複製尋呼前行到一個臨時表 - :

    我可以通過以下任一方式來避免此類問題太慢

  3. 通過行號和排序值的組合來選擇 顯示在前一頁的末尾,在處恢復基於轉換臺合適的地方,但仍然得到 只剩下一N行

我有點像第三解決方案,但我發現很難當有排序列(重複值實現小號)。

例如,假設我有按降序排列的文章列表。如果等級相同,它們是按升序編號排序(該ID是唯一的):

ID  RATING 
9  34 
3  32 
6  32 
8  32 
12  32 
1  25 
2  23 

現在,我想3篇文章,這意味着在第一頁就會有第9條,第3和第6頁。這是通過查詢排序列表中排名前三位的文章完成的。

現在,我想從第8條中繼續接下來的3篇文章,使用文章ID作爲標記恢復的位置。

如果我告訴數據庫採取第8條的聲譽和比拿3篇具有聲譽低於,我將跳過第12條

如果我告訴數據庫作爲文章的聲譽8並且比3個聲譽低於或等於此的文章,我會重複第3條和第6條。

可以使用什麼SQL查詢(或查詢組合)來恢復第8條的分頁,使用文章ID作爲哪裏恢復的標記?

+0

不幸的是,你的要求不能不自相矛盾。您的目標是要始終向人們展示他們以前從未見過的人物文章,還是要確保排名準確?如果我查看前3名,則有人將ID 8更改爲33(將第6頁降至第2頁),但您不想在第2頁上顯示6,因爲他們已經看到了它?如果他們再次轉到第1頁會怎麼樣? – 2012-02-22 13:28:51

+0

@AaronBertrand好的,好點。我想向用戶展示他們以前從未見過的文章。那麼在這種情況下你會做什麼?緩存整個表格是唯一的解決方案,可以在不同頁面之間提供一致的結果? – 2012-02-22 13:36:18

+0

再一次,我不清楚你的目標。您是否希望用戶查看陳舊的數據,即使評級在此期間實際發生了變化?如果我正在查看eBay上的物品,並且其中一件物品的出價上漲了,我希望在出價之前將其準確地重新排序。那麼你試圖解決的實際問題是什麼? – 2012-02-22 13:37:43

回答

3

將註釋轉換爲答案,因爲它似乎解決了用戶的問題。

所以看起來你應該緩存該用戶的結果(例如,你可以發送所有的ID到應用程序,並且每次只讀取一次3篇文章),但是也可以添加一個免責聲明,如果它他們花了半個小時滾動列表,列表可能不再準確。