2012-10-23 29 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

谢谢** **亚当为我工作。 –