2012-10-23 71 views
0

對於我的應用程序創建一個SQL查詢生成器已得到順序按條款。我想知道如何對結果進行分頁,即我想獲得有關如何通過SQL查詢結果分頁的模板。這說明可能是有點混亂,所以它可能是用一個例子更容易:分頁的SQL查詢模板

考慮測試表

CREATE TABLE [dbo].[TestTable](
    [RecordID] [int] NOT NULL, 
    [ID] [nvarchar](1000) NULL, 
    [Name] [nvarchar](1000) NULL, 
    [Dept] [nvarchar](1000) NULL 
) 
INSERT [dbo].[TestTable] 
    SELECT 1, N'1', N'Andy', N'IT' 
UNION ALL 
    SELECT 2, N'2', N'Bob', N'IT' 
UNION ALL 
    SELECT 3, N'3', N'Camila', N'Sales' 
UNION ALL 
    SELECT 4, N'4', N'Drew', N'IT' 
UNION ALL 
    SELECT 5, N'5', N'Elsie', N'Sales' 
UNION ALL 
    SELECT 6, N'6', N'Frank', N'IT' 
UNION ALL 
    SELECT 7, N'7', N'Gaby', N'Sales' 
UNION ALL 
    SELECT 8, N'8', N'Hank', N'IT' 
UNION ALL 
    SELECT 9, N'9', N'Iris', N'Sales' 
UNION ALL 
    SELECT 10, N'8', N'John', N'IT' 

讓我們說,我有一個條款爲:

WHERE ([Dept] = 'IT') 

而一個順序按條款爲:

ORDER BY [Name] DESC 

我試圖通過使用類似做分頁:

SELECT [RECORDID], [ID], [Name], [Dept], RowNum 
    FROM (
      SELECT [RECORDID], [ID], [Name], [Dept], 
        ROW_NUMBER() OVER (ORDER BY [RecordID]) AS RowNum 
      FROM [TestTable] WHERE ([Dept] = 'IT') 
     ) AS [TestTable_DerivedTable] 
WHERE [TestTable_DerivedTable].RowNum BETWEEN 3 AND 6 ORDER BY [Name] DESC 

這不工作,因爲我不能讓ORDER BY [Name] DESC進入[TestTable_DerivedTable]。 如果我剛結束了WHERE子句,它將返回名稱:

安迪,鮑勃,德魯,弗蘭克,漢克和約翰。

如果我把分頁即3至6,我正確地得到:

德魯,弗蘭克,漢克和約翰

如何添加ORDER BY [Name] DESC讓我得到(首先逆轉,然後分頁)

弗蘭克,德魯,Bob和安迪

回答

2

如果移動ORDER BY [Name] DESC到窗口功能,你會得到你想要的東西:

SELECT [RECORDID], [ID], [Name], [Dept], RowNum 
FROM 
(
    SELECT [RECORDID], [ID], [Name], [Dept] 
     , ROW_NUMBER() OVER (ORDER BY [Name] DESC) AS RowNum 
    FROM [TestTable] WHERE ([Dept] = 'IT') 
) AS [TestTable_DerivedTable] 
WHERE [TestTable_DerivedTable].RowNum BETWEEN 3 AND 6 
+0

謝謝** **亞當爲我工作。 –