【问题标题】:Offset and Fetch Next Record occurs in multiple page偏移和获取下一条记录发生在多个页面中
【发布时间】:2020-12-26 11:48:30
【问题描述】:

最近我在 SQL Server 中使用 offset 和 fetch next 进行分页时遇到一个问题,一些记录出现在多个页面中。

SELECT A.ID, A.Col1, A.Col2, A.Status
FROM (
    SELECT ID, Col1, Col2, Status
    FROM Table1
    ORDER BY Status
    OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY --# 100 just for sample, first page will be 0 and 100
) AS A
ORDER BY A.Status

ID 是主键,它出现在不同的页面中,有很多相同状态的记录,但根据我的理解,数据库中的顺序应该相同。现在我使用ROW_NUMBER 没有问题。

但仍想知道OFFSETFETCH NEXT 的任何问题,以及如何解决此问题?

【问题讨论】:

    标签: sql sql-server subquery sql-order-by sql-limit


    【解决方案1】:

    如果有多条状态相同的记录,那么order by status不是一个稳定子句;当存在平局时,数据库必须决定哪条记录首先出现,这可能在同一查询的连续执行中不一致。

    要获得稳定的结果集,您需要order by 列,其组合表示唯一键。这里,一个简单的解决方案是在子句中添加主键:

    所以:

    SELECT ID, Col1, Col2, Status
    FROM Table1
    ORDER BY Status, ID
    OFFSET 100 ROWS FETCH NEXT 100 ROWS ONLY 
    

    请注意,您不需要子查询:您可以在同一范围内选择、排序和获取。

    【讨论】:

    • 是的,subQuery 是不需要的,好吧,我会再添加一列进行排序。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多