OFFSET ... 在第二页取重叠结果

blo*_*ead 5 sql-server offset-fetch

使用时OFFSET ... FETCH,我得到了……有趣的结果。

这里有两个 sqlfiddles 来说明我的问题。

http://sqlfiddle.com/#!6/71ac1/4http://sqlfiddle.com/#!6/71ac1/8

第一个小提琴是第一页,而第二个是...第二页。

是未分页的结果。

首先,分页结果与未分页结果的顺序不同。我想我对此很酷,因为无论如何我都不会显示未分页的结果。

但是,尽管我指定的偏移量为 0,但由于某种原因,它决定将它们按输入的相反顺序放置,但它跳过了前 3 个。

在第二页上,我看到了出现在第一页上的结果。


尽管在本示例中是人为设计的,但它们都具有相同的值这一事实在我在现实生活中处理的特定查询中是现实的。这是一个表格,用户选择按 排序date

ype*_*eᵀᴹ 13

这并不意外。您ORDER BY不能确定完整(唯一)的订单。如MSDN 文档中所述

要在使用和 的查询请求之间获得稳定的结果,必须满足以下条件:OFFSETFETCH

  1. 查询使用的基础数据不得更改。...

  2. ORDER BY子句包含保证唯一的一列或列组合

您有,order by date但所有行在date. 要使用 获得确定的结果TOP / OFFSET ... FETCH,您必须使用 ORDER BY完全确定排序的 。

例如,您可以使用:

order by date asc,
         name asc 
Run Code Online (Sandbox Code Playgroud)

或(如果(date, name)也不是唯一的:

order by date asc,
         eventID asc
Run Code Online (Sandbox Code Playgroud)

或者:

order by date asc,
         name asc,
         eventID asc
Run Code Online (Sandbox Code Playgroud)

如果查询是由某种形式生成的并且可以由用户自定义,则您可以 - 在幕后 -eventID在 order by 列表的末尾添加主键列(我猜是这里),这样您就有了一个订单这是确定的,并且在不同的查询执行中保持不变。