Sql 使用行编号()选择行的子集

Sql 使用行编号()选择行的子集,sql,database,sql-server-2008-r2,row-number,Sql,Database,Sql Server 2008 R2,Row Number,我正在尝试选择介于50和60之间的行的子集。问题是“RowNo”是无效的列名 多谢各位 使用SQL SERVER 2008 R2,您需要执行以下操作: Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo' from customers where RowNo between 50 AND 60 ;WITH PaginatingData AS ( Select id, name, ROW_NUMBER() OVER

我正在尝试选择介于50和60之间的行的子集。问题是“RowNo”是无效的列名

多谢各位


使用SQL SERVER 2008 R2,您需要执行以下操作:

Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo'
from customers
where RowNo between 50 AND 60
;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
成为有效的列名

作为outlook—使用SQL Server 2012,您可以编写如下内容:

Select id, name, ROW_NUMBER() OVER (ORDER BY id asc) as 'RowNo'
from customers
where RowNo between 50 AND 60
;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

SQL Server 2012将使用符合ANSI SQL标准的表示法,直接基于
ORDER BY
子句进行分页。(或大量其他)以获取更多信息和更多样本。

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

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

您也可以使用CTE,但是否选择一个而不是另一个读取并检查执行计划。

因为RowNo
不需要引号:
“RowNo”
,是吗?@ypercube它没有,但也没有错。这只是在T-SQL中不太常见的语法。@ypercube:我认为这不是绝对必要的-我只是把它放在OP发布的地方。就我个人而言,我会使用
RowNo=ROW_NUMBER()…
符号,但这只是个人的style@ypercube请看我对这个问题的评论(我在看到这些评论之前就离开了)。我意识到marc只是复制了OP的代码,但尽管今天的语法没有错,但在SQL Server的未来版本中它将是错的。谢谢!我不知道为什么在mysql中使用LIMIT 49,10时需要执行如此复杂的查询!你能告诉我为什么我们要写“t”吗?@test:因为SQL Server没有限制x偏移量y,就像MySQL一样。它只有
TOP n
,这与MySQL的
LIMIT n
相同。但是它确实有分析功能,比如
ROWN_NUMBER()
和其他功能,你可以做更复杂的事情(在MySQL中很难做到)。@test SQL Server 2012实现了标准的分页方法(
OFFSET
/
FETCH
)。当然,MySQL很简单,但它是非标准的。我在这里写了博客:@test
t
是子查询的别名,如果没有它,你会得到一个错误(你可以尝试)。更多信息。请不要对别名使用
'string delimiters'
。这种语法是非标准的,可能会非常混乱(例如,
选择“a”“b”
),并且在SQL Server中已被弃用。请使用
[方括号]
(也不是标准)或
“双引号”
(标准),或没有分隔符。有关详细信息和大量争论,请参阅第页。争论的焦点是您应该使用什么。几乎没有人认为不应该使用单引号。@Aaron:thnx,我不确定这在最新版本中是否已弃用或不允许使用。@ypercube它在当前版本中仍然有效,但它确实会引发弃用的警告事件(trace/perfmon)。只有某些表单会引发不推荐的事件,但情况不同。