2

関数を使用ROW_NUMBER()して、データベーステーブルから50x50のアイテムを取得します。
@Fromパラメータは、50行の取得を開始する行です。(初めて51,101,151などが1になります。)ストアドプロシージャに
パラメータを渡します。@CityIdデータベースの最初の60行が行61にある場合cityId=1cityId = 2このストアドプロシージャは結果を返しません。
しかし、@ 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()は、はすべての行を列挙しています。の述語をcityid最も内側のselectに移動すると、。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
于 2012-05-26T09:33:26.330 に答える
2

あなたがしたいのは、次のように、内部のselectクエリで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 に答える