我需要使用分頁讀取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;
可能無法可靠地工作。插入的行可以跳過,或者可能導致後續行重複,刪除的行可能導致後續行被跳過。整個分頁中
- 鎖定對更新行 - 太 限制性
- 複製尋呼前行到一個臨時表 - :
我可以通過以下任一方式來避免此類問題太慢
- 通過行號和排序值的組合來選擇 顯示在前一頁的末尾,在處恢復基於轉換臺合適的地方,但仍然得到 只剩下一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作爲哪裏恢復的標記?
不幸的是,你的要求不能不自相矛盾。您的目標是要始終向人們展示他們以前從未見過的人物文章,還是要確保排名準確?如果我查看前3名,則有人將ID 8更改爲33(將第6頁降至第2頁),但您不想在第2頁上顯示6,因爲他們已經看到了它?如果他們再次轉到第1頁會怎麼樣? – 2012-02-22 13:28:51
@AaronBertrand好的,好點。我想向用戶展示他們以前從未見過的文章。那麼在這種情況下你會做什麼?緩存整個表格是唯一的解決方案,可以在不同頁面之間提供一致的結果? – 2012-02-22 13:36:18
再一次,我不清楚你的目標。您是否希望用戶查看陳舊的數據,即使評級在此期間實際發生了變化?如果我正在查看eBay上的物品,並且其中一件物品的出價上漲了,我希望在出價之前將其準確地重新排序。那麼你試圖解決的實際問題是什麼? – 2012-02-22 13:37:43