SQL ROW_NUMBER() 分页问题

标签 sql sql-server database tsql row-number

我使用 ROW_NUMBER() 函数从数据库表中获取 50 x 50 项。
@From 参数是从中开始抓取 50 行的行。 (51,101,151等第一次是1)
我将参数 @CityId 传递给存储过程,如果数据库中的前 60 行是 cityId=1 并且 cityId = 2 在第 61 行中,则此存储程序不返回结果。
但是,如果我传递@From 参数51,它会返回结果。 我在这里做错了什么?

SELECT  RowConstrainedResult.*
FROM    ( SELECT    ROW_NUMBER() OVER 
( ORDER BY f.ItemCreatedOnDate DESC ) AS RowNum, 
f.*
FROM (
SELECT
      t.ItemIdId,
      t.ItemTypeId,
      t.CreatedOnDate as ItemCreatedOnDate,
      t.CityId as CityId
FROM   dbo.Items    as t
) f) AS RowConstrainedResult
WHERE   RowNum >= @From
    AND RowNum < @From + 50
    AND CityId = @CityId

最佳答案

在您的版本中,ROW_NUMBER() 正在枚举所有行。将 cityid 的谓词移动到最里面的选择,ROW_NUMBER() 将仅枚举 cityid = 2 的行。

SELECT RowConstrainedResult.*
FROM (
     SELECT ROW_NUMBER() OVER (ORDER BY f.ItemCreatedOnDate DESC) AS RowNum, 
            f.*
     FROM (
          SELECT t.ItemIdId,
                 t.ItemTypeId,
                 t.CreatedOnDate as ItemCreatedOnDate,
                 t.CityId as CityId
          FROM dbo.Items AS t
          WHERE CityId = @CityId
          ) AS f
     ) AS RowConstrainedResult
WHERE RowNum >= @From AND 
      RowNum < @From + 50

关于SQL ROW_NUMBER() 分页问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10765028/

相关文章:

MySQL寻找最相似的用户

.net - 使用 ExecuteNonQuery 覆盖 SQL Server 中受影响的行?

SQL - 说明 - ISNULL()

sql - 按给定字段对多个 SQL 结果进行分组

database - Worklight Server 是否支持存储 JSON 文件?

定期数据库批量插入的Java并发

mysql - 将两个表合并为一个输出 SQL

sql - 我应该如何加入这些表?

sql - 最佳实践 : foreign keys as primary keys or unique constraint

mysql - 如何在sql中搜索大型数据库中具有2个公共(public)列的表?