我在没有TOP
的情况下执行ORDER BY
查询时看到SQL Server返回的结果在执行之间可能会有所不同,因为它不能保证您收到相同的前x值由于缺少排序。
我想知道以下示例中是否相同:
在表格person
中,有id
,name
和age
列。该表包含数千行,但所有人都具有相同的年龄。 id是唯一的。
我现在想要翻页,其页面大小为例如20并按年龄排序。
SELECT *
FROM person
ORDER BY age
-- ,id -- is this necessary?
OFFSET 0 ROWS FETCH NEXT 20 ROWS ONLY;
是否会出现与TOP
子句相同的问题,因为它按顺序排列的条件与页面大小匹配的记录多得多?我是否必须按id
进行额外订购,以确保在浏览每个记录只出现一次的页面时?
答案 0 :(得分:2)
是。 ORDER BY
是 控件,您必须告诉服务器您希望它提供哪些排序保证。你在ORDER BY
条款中未能说出的任何内容都是公平的游戏,因为系统不尊重。
对于可靠的分页 1 ,您需要确保在ORDER BY
子句中有足够的表达式,以便每行的位置唯一定义。对于单个表SELECT
,通过在任何其他排序条件之后包含所有主键列,可以最轻松地实现此目的。
1 但请注意,这仍然假设表中的数据是 static 。获得"一次且仅一次"在使用分页和面对插入,更新和删除的可能性时显示数据可能很棘手,而且通常在这里你最终会接受偶尔的分页事故。
答案 1 :(得分:0)
添加Id在某种程度上会有所帮助,但无论您如何分页,SQL select语句都不具有确定性 你不能在查询执行中做出唯一性的假设。