【问题标题】:SQL Offset losing its order in SQL ServerSQL 偏移量在 SQL Server 中失去其顺序
【发布时间】:2020-01-08 06:49:34
【问题描述】:

我有一个名为#MytempTable 的排序临时表 排序不仅基于特定的列,还基于许多其他因素

现在我想使用OFFSET 进行分页

OFFSET @PageSize*(@PageNumber-1) Row Fetch Next @PageSize Rows Only

但是如果我在下面的临时表上这样做

Select * 
from #MytempTable 
ORDER BY ( SELECT NULL) OFFSET
@PageSize*(@PageNumber-1) Row Fetch Next @PageSize Rows Only

我在临时表上的订单丢失了。

我想保留偏移后临时表的顺序。

【问题讨论】:

  • 您使用的是哪个DBMS 产品? “SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加tagWhy should I tag my DBMS

标签: sql sql-server sql-order-by offset


【解决方案1】:

除非您在查询中指定Order By,否则永远不会保证结果集中的顺序。 即使您想要按clustered key 排序的结果集,由于许多因素,它也可能不会按该顺序返回。

在您的情况下,我认为您可以在temp table 中添加一个新的身份(自动填充)列,并且在select 时,您应该将该列与Order By 子句一起使用,而不是Order By (select null)

【讨论】:

  • 但是有一个order by。 SQL Server 在使用FETCH 时需要它。
  • @GordonLinoff - 是的,根据我的回答,我们需要 order by 和 Identity 列。
【解决方案2】:

桌子上没有订单。甚至在“临时桌子”上也没有。

这是 SQL 的基本原则:表(以及没有ORDER BY 的结果集)代表无序 集。时期。使用数据中的列在数据中捕获订购信息。

没有ORDER BY 的结果集可以按任何顺序返回——并且在后续执行中按不同的顺序返回。

当您添加ORDER BY (SELECT NULL) 时,您明确说明:“我必须在此处添加ORDER BY,但我不关心排序。”这延伸到:“我不在乎后续执行是否相同。

可以在使用标识列创建临时表时保持顺序。例如:

select identity(int) as temp_id, . . .
into #temp
from . . . 
order by <whatever you want here>;

然后你可以在查询表时使用order by temp_id恢复排序。

【讨论】:

    猜你喜欢
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2013-02-09
    • 2014-07-12
    • 1970-01-01
    • 2016-02-28
    • 2012-05-30
    相关资源
    最近更新 更多