2012-04-01 27 views
1

我從數據庫列表中獲得按降序排列的項目。
我使用ROW_NUMBER()函數來獲得50個50個項目。
第一次我需要從1-50中獲得的項目比51-100等。
我有數據庫項目類型1,這些都是我得到的項目。
數據庫中有成千上萬個項目。
所以當我第一次調用存儲過程時,我把它傳遞給第一個數(從哪個項目中獲得下一個50)。
所以這應該返回我前50項。現在我添加到條款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

看來你要白坯分頁?爲什麼你不只是使用TOP 50,而在下一個你做TOP 100的時候,然後是TOP 50,然後改變訂單。 – YvesR 2012-04-01 11:42:13

+0

我不知道。老開發人員告訴我,使用ROW_NUMBER()會更好,但如果沒有性能問題,我可以使用TOP X. @Mitch小麥:你說什麼代碼? – 1110 2012-04-01 11:49:22

+0

請閱讀這篇文章(http://blogs.msdn.com/b/conor_cunningham_msft/archive/2012/02/02/conor-vs-window-functions-sequence-ranking-functions-order-of-operations.aspx)康納爾坎寧安寫的。 – 2012-04-01 12:17:31

回答

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 2012-04-01 12:47:41

相關問題