sql - 在Sql Server 2014中,带有OFFSET FETCH NEXT的ORDER BY子句返回奇怪的结果

标签 sql sql-server

我当前正在使用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行这样的行,它们在BeginTimeEndTime中的值完全相同。持续时间在相关表中从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 。任何帮助,答案或评论都将被接受。谢谢你!

最佳答案

documentation解释:

To achieve stable results between query requests using OFFSET and FETCH, the following conditions must be met:

. . .

  1. The ORDER BY clause contains a column or combination of columns that are guaranteed to be unique.


您的情况是BeginTime不是唯一的。总体而言,数据库(尤其是SQL Server)无法实现稳定的排序。一种稳定的排序是在键相同时行以相同顺序排列的排序。这很明显,因为表和结果集表示无序集。它们没有固有的顺序。

因此,您需要一个唯一的 key 才能使排序稳定。给定您的数据,这似乎是durationname或两者:
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/

相关文章:

sql - 删除与 LIKE 子字符串匹配的行?

sql-server - 无法使用 key 存储提供程序解密列加密 key : 'AZURE_KEY_VAULT'

sql - 在 SQL Server 中查找是否有包含 null 的列

sql-server - 如何在SQL Server中添加字符串来获取最小值?

c# - 每当通过 Web 应用程序将记录插入 SQL Server 时,触发 winforms 程序运行

mysql - 是否可以调用网址(http ://) in mysql trigger?

sql - MariaDB 案例声明

sql - 如果应用程序崩溃,如何注销客户端

mysql - 如何忽略表 1 中的记录(其 fk 引用必须存在于表 2 中)但条件不满足

sql - 如何在 SQL Server 2008 中使用 SQL 查询生成具有约束的表的创建脚本