使用Row_Number()选择行的子集

时间:2012-02-17 13:05:36

标签: sql database sql-server-2008-r2 row-number

Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo'
from customers
where RowNo between 50 AND 60

我正在尝试选择50到60之间的行子集。问题是'RowNo'是无效的列名。

谢谢

使用SQL SERVER 2008 R2

2 个答案:

答案 0 :(得分:11)

将您的查询用作子查询,如下:

select * from (
    Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as [RowNo]
    from customers
) t
where RowNo between 50 AND 60

您也可以使用CTE,但是是否选择一个而不是另一个阅读Difference between CTE and SubQuery?并检查执行计划。

答案 1 :(得分:5)

你需要做这样的事情:

;WITH PaginatingData AS
(
    Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo'
    from customers
)
SELECT *
FROM PaginatingData
where RowNo between 50 AND 60

使用CTE(公用表表达式 - 一种“内联视图”)作为“包装器”,以便RowNo成为有效的列名。

作为展望 - 使用SQL Server 2012,您可以编写如下内容:

SELECT 
    id, name
FROM 
    dbo.customers
ORDER BY
    id
OFFSET 50 ROWS
FETCH NEXT 10 ROWS ONLY

SQL Server 2012将使用符合ANSI SQL标准的符号直接根据ORDER BY子句进行分页。 See this blog post(或其他许多人)获取更多信息和更多样本。