我当前正在使用Sql Server 2014 Professional,当前版本是(12.0.4100)。我有一个 View ,我正在尝试选择具有特定偏移量的10行。我的 View 如下所示:
BeginTime | EndTime | Duration | Name
09:00:00.0000000|16:00:00.0000000| 1 | some_name1
09:00:00.0000000|16:00:00.0000000| 2 | some_name2
09:00:00.0000000|16:00:00.0000000| 3 | some_name3
09:00:00.0000000|16:00:00.0000000| 4 | some_name4
09:00:00.0000000|16:00:00.0000000| 5 | some_name5
09:00:00.0000000|16:00:00.0000000| 6 | some_name6
09:00:00.0000000|16:00:00.0000000| 7 | some_name7
有100行这样的行,它们在
BeginTime
和EndTime
中的值完全相同。持续时间在相关表中从1增加到100。如果仅查询:SELECT * FROM View_Name
ResultSet是正确的。我可以通过查看工期列来了解它。
如果我只想获取从0开始的10行,则ResultSet是正确的,并且它从18开始都是正确的。当我想获取从19或19以上开始的10行时,ResultSet中的Duration返回不相关的结果,例如Duration反转。但是它永远不会返回持续时间超过11的行。
我用来获取特定行的查询如下:
SELECT * FROM View_Name ORDER BY BeginTime ASC OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY
在这种情况下,还有一些奇怪的事情。如果我指定
USE master
,则此问题消失,但是,如果我指定USE [mydb_name]
,则该问题再次出现。顺便说一句,我在本地PC中使用SQL SERVER 2014 Professional v(12.0.2269),对于上述情况,此问题消失了。PS:我不能使用
USE master
,因为我正在存储过程中动态创建和列出 View 。任何帮助,答案或评论都将被接受。谢谢你!
最佳答案
To achieve stable results between query requests using
OFFSET
andFETCH
, the following conditions must be met:. . .
- The
ORDER BY
clause contains a column or combination of columns that are guaranteed to be unique.
您的情况是
BeginTime
不是唯一的。总体而言,数据库(尤其是SQL Server)无法实现稳定的排序。一种稳定的排序是在键相同时行以相同顺序排列的排序。这很明显,因为表和结果集表示无序集。它们没有固有的顺序。因此,您需要一个唯一的 key 才能使排序稳定。给定您的数据,这似乎是
duration
,name
或两者:SELECT *
ROM View_Name
ORDER BY BeginTime ASC, Duration, Name
OFFSET 20 ROWS FETCH NEXT 10 ROWS ONLY;
关于sql - 在Sql Server 2014中,带有OFFSET FETCH NEXT的ORDER BY子句返回奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37184267/