在PostgreSQL中,有Limit和Offset关键字,可以非常容易地对结果集进行分页。
SQL Server的等效语法是什么?
在PostgreSQL中,有Limit和Offset关键字,可以非常容易地对结果集进行分页。
SQL Server的等效语法是什么?
当前回答
详细阐述Somnath-Muluk的回答:
SELECT *
FROM table_name_here
ORDER BY (SELECT NULL AS NOORDER)
OFFSET 9 ROWS
FETCH NEXT 25 ROWS ONLY
W /o添加任何额外的列。 在SQL Server 2019中测试,但我猜也可以在旧的版本中工作。
其他回答
这里有人在sql 2011中讲述了这个功能,令人遗憾的是,他们选择了一个有点不同的关键字“OFFSET / FETCH”,但它不是标准的,然后ok。
因为,我测试了更多次这个脚本更有用的100万条记录,每页100条记录分页工作更快,我的PC执行这个脚本0秒,而与mysql相比有自己的限制和偏移约4.5秒得到结果。
有些人可能不理解Row_Number()总是按特定字段排序。如果我们只需要按顺序定义行,应该使用:
Row_number () over (order by (select null))
SELECT TOP {LIMIT} * FROM (
SELECT TOP {LIMIT} + {OFFSET} ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS ROW_NO,*
FROM {TABLE_NAME}
) XX WHERE ROW_NO > {OFFSET}
解释:
{LIMIT}:每页的记录数 {OFFSET}:跳过记录的个数
另一个例子:
declare @limit int
declare @offset int
set @offset = 2;
set @limit = 20;
declare @count int
declare @idxini int
declare @idxfim int
select @idxfim = @offset * @limit
select @idxini = @idxfim - (@limit-1);
WITH paging AS
(
SELECT
ROW_NUMBER() OVER (order by object_id) AS rowid, *
FROM
sys.objects
)
select *
from
(select COUNT(1) as rowqtd from paging) qtd,
paging
where
rowid between @idxini and @idxfim
order by
rowid;
select top {LIMIT HERE} * from (
select *, ROW_NUMBER() over (order by {ORDER FIELD}) as r_n_n
from {YOUR TABLES} where {OTHER OPTIONAL FILTERS}
) xx where r_n_n >={OFFSET HERE}
注意: 这个解决方案只能在SQL Server 2005或更高版本中工作,因为这是实现ROW_NUMBER()的时候。
因为还没有人提供这个代码:
SELECT TOP @limit f1, f2, f3...
FROM t1
WHERE c1 = v1, c2 > v2...
AND
t1.id NOT IN
(SELECT TOP @offset id
FROM t1
WHERE c1 = v1, c2 > v2...
ORDER BY o1, o2...)
ORDER BY o1, o2...
重要的几点:
ORDER BY必须相同 @limit可以替换为检索结果的数量, @offset是要跳过的结果数 请将性能与以前的解决方案进行比较,因为它们可能更有效 这个解决方案重复了where和order by子句,如果它们不同步,将提供不正确的结果 另一方面,如果需要的话,order by是明确存在的