2012-04-01 6 views
1

降順で並べ替えられたアイテムのデータベースリストから取得しています。
私はROW_NUMBER()機能を使用して、50×50のアイテムを取得します。
初めて、私は51-100などより1から50のアイテムを入手する必要があります。
私はタイプ1のデータベースアイテムを持っています。
データベースには数千ものアイテムがあります。
私は最初にストアドプロシージャを呼び出すときに、それを次の50になる項目の番号(1番)に渡します。
これは私に最初の50項目を返す必要があります。今私はwhere句RowNum < 1+50に追加しますが、クエリから取得する行番号は35,37,38,43,44,45,55,67などです。したがって、私のストアドプロシージャは35 to 45の項目のみを返します。 私はクエリで愚かなミスをしたが、それを見つけることができないと思う。ROW_NUMBER()が最初に好きな数のアイテムを返さない

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY Products.CreatedOnDate DESC) AS RowNum, Products.*   
      FROM  Products   
      WHERE  Products.CreatedOnDate <= GETDATE() 
     ) AS RowConstrainedResult 
WHERE RowNum >= 1 
    AND RowNum < 1+50 -- here I use parameter but currently I hardcode '1' 
    AND ProductTypeId = 1 
ORDER BY RowNum 
+0

あなたがtofoのページネーションをしたいようですか? TOP 50を使っているだけでなく、次にTOP100を内側に、TOP 50を外側にしてORDERを変更するのはなぜですか? – YvesR

+0

私は分かりません。以前の開発者は、ROW_NUMBER()を使用する方がパフォーマンスが優れていると言っていましたが、パフォーマンスの問題がなければTOP Xを使用できます。 @Mitch Wheat:どのコードを意味していますか? – 1110

+0

この記事をお読みください(http://blogs.msdn.com/b/conor_cunningham_msft/archive/2012/02/02/conor-vs-window-functions-sequence-ranking-functions-order-of-operations.aspx) Conor Cunninghamによって書かれています。 –

答えて

6

あなたはProductTypeIDにフィルタリングされているが、Row_Numberと内側のクエリはしていません:

SELECT * 
FROM (SELECT ROW_NUMBER() OVER (ORDER BY Products.CreatedOnDate DESC) AS RowNum 
       , Products.*   
      FROM  Products   
      WHERE Products.CreatedOnDate <= GETDATE() 
      AND  ProductTypeId = 1 
     ) AS RowConstrainedResult 
WHERE RowNum >= 1 
AND  RowNum < 1+50 
ORDER BY RowNum 
+0

私はそれが私が逃した何か知っていた:)ありがとう – 1110

関連する問題