5
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

4

2 回答 2

14

使用您的查询作为子查询,如下所示:

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

您也可以使用 CTE,但是否选择一个而不是另一个阅读CTE 和子查询之间的区别?并检查执行计划。

于 2012-02-17T13:09:09.947 回答
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子句进行分页。有关更多信息和更多示例,请参阅此博客文章(或其他大量文章)。

于 2012-02-17T13:08:43.540 回答