2

我使用ROW_NUMBER()函数从数据库表中获取 50 x 50 项。
@From参数是从中开始抓取 50 行的行。(第一次是 1 即 51,101,151 等)
我将参数传递@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
4

2 回答 2

7

在您的版本中,ROW_NUMBER()正在枚举所有行。将谓词 for 移动cityid到最里面的选择,并且ROW_NUMBER()只会枚举 where 的行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
于 2012-05-26T09:33:26.330 回答
2

我猜你想要做的是在内部选择查询中过滤 CityId ,如下所示:

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
) f) AS RowConstrainedResult
WHERE   RowNum >= @From
    AND RowNum < @From + 50
于 2012-05-26T09:33:32.760 回答