【问题标题】:SQL ROW_NUMBER and sorting issueSQL ROW_NUMBER 和排序问题
【发布时间】:2012-06-14 09:41:21
【问题描述】:

在 SQL 2005/2008 数据库中,我们有表 BatchMaster。列: RecordId bigint - 自动增量 ID,BatchNumber bigint - 唯一非聚集索引,BatchDate)。我们有从这个表返回分页数据的 sproc。该存储过程适用于大多数客户端,但在一个 SQL 服务器实例中,我们的记录顺序存在问题。 一般来说,在 sproc 我们会这样做

select * from
(
    select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row,
    *
    from dbo.BatchMaster bm with (nolock)
)
where Row between @StartingRow and @EndgingRow

因此,您可以从上面的脚本中注意到,我们希望返回按 BatchDate 和 BatchNumber 排序的记录。这不会发生在我们的一位客户身上:

记录顺序错误。另外,请注意第一列(行),它不是按升序排列的。

有人可以解释为什么会这样吗?

【问题讨论】:

  • 您需要对最外层的查询进行排序

标签: sql sql-server sorting sql-order-by row-number


【解决方案1】:

ROW_NUMBER 排名函数中的 ORDER BY 子句仅适用于计算该排名函数的值,它实际上并不对结果进行排序。

如果您希望按特定顺序返回记录,则需要在查询中指定:ORDER BY [Row]

【讨论】:

    【解决方案2】:

    更改您的查询以在最外层查询中包含排序

    select * from
    (
        select row_number() over (order by bm.BatchDate desc, bm.BatchNumber desc) as Row,
        *
        from dbo.BatchMaster bm with (nolock)
    )
    where Row between @StartingRow and @EndgingRow
    order by Row
    

    【讨论】:

      【解决方案3】:

      假设您想要给定 BatchDate 的最低 BatchNumber 和最小的 Row 编号,并且您希望通过 Row 排序,试试这个:

      select * from
      (
          select row_number() over (order by bm.BatchDate desc, bm.BatchNumber asc) as Row,
          *
          from dbo.BatchMaster bm with (nolock)
      )
      where Row between @StartingRow and @EndgingRow
      order by Row
      

      【讨论】:

        【解决方案4】:

        您的代码实际上并未对结果进行排序,它仅根据 BatchDate 和 Batchnumber 的顺序设置“行”,并且似乎正确地执行了该操作。您需要在语句中添加 ORDER BY Row。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-06-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-18
          • 1970-01-01
          • 2022-07-06
          • 2013-10-13
          相关资源
          最近更新 更多