是按分页所需的密钥排序

时间:2018-03-15 08:19:14

标签: sql-server tsql

我在没有TOP的情况下执行ORDER BY查询时看到SQL Server返回的结果在执行之间可能会有所不同,因为它不能保证您收到相同的前x值由于缺少排序。

我想知道以下示例中是否相同:

在表格person中,有idnameage列。该表包含数千行,但所有人都具有相同的年龄。 id是唯一的。

我现在想要翻页,其页面大小为例如20并按年龄排序。

SELECT *
FROM person
ORDER BY age
   -- ,id     -- is this necessary?
OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY;

是否会出现与TOP子句相同的问题,因为它按顺序排列的条件与页面大小匹配的记录多得多?我是否必须按id进行额外订购,以确保在浏览每个记录只出现一次的页面时?

http://sqlfiddle.com/#!18/93988/3

2 个答案:

答案 0 :(得分:2)

是。 ORDER BY 控件,您必须告诉服务器您希望它提供哪些排序保证。你在ORDER BY条款中未能说出的任何内容都是公平的游戏,因为系统不尊重。

对于可靠的分页 1 ,您需要确保在ORDER BY子句中有足够的表达式,以便每行的位置唯一定义。对于单个表SELECT,通过在任何其他排序条件之后包含所有主键列,可以最轻松地实现此目的。

1 但请注意,这仍然假设表中的数据是 static 。获得"一次且仅一次"在使用分页和面对插入,更新和删除的可能性时显示数据可能很棘手,而且通常在这里你最终会接受偶尔的分页事故。

答案 1 :(得分:0)

添加Id在某种程度上会有所帮助,但无论您如何分页,SQL select语句都不具有确定性 你不能在查询执行中做出唯一性的假设。