gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:33:44 26 4
gpt4 key购买 nike

我当前正在使用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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com