在PostgreSQL中有Limit
andOffset
关键字可以非常容易地分页结果集。
SQL Server的等效语法是什么?
在PostgreSQL中有Limit
andOffset
关键字可以非常容易地分页结果集。
SQL Server的等效语法是什么?
Answers:
相当于LIMIT
是SET ROWCOUNT
,但如果你想通用分页,最好写这样的查询:
;WITH Results_CTE AS
(
SELECT
Col1, Col2, ...,
ROW_NUMBER() OVER (ORDER BY SortCol1, SortCol2, ...) AS RowNum
FROM Table
WHERE <whatever>
)
SELECT *
FROM Results_CTE
WHERE RowNum >= @Offset
AND RowNum < @Offset + @Limit
这样做的好处是,如果您决定更改分页选项(或允许用户这样做),则可以对偏移量和限制进行参数化。
注意:@Offset
为此,该参数应使用基于1的索引,而不是基于零的常规索引。
WHERE RowNum >= (@Offset + 1)
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP or FOR XML is also specified
。MSSQL2008 R2。
Table
有200k记录,它将首先获取所有记录,然后应用限制?这个查询有效吗?
现在,在SQL Server 2012中可以轻松使用此功能。从SQL Server 2012起可以使用此功能。
用偏移量限制以选择SQL Server中的11至20行:
SELECT email FROM emailTable
WHERE user_id=3
ORDER BY Id
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
OFFSET
:跳过的行数NEXT
:下一行所需的数量参考:https : //docs.microsoft.com/zh-cn/sql/t-sql/queries/select-order-by-clause-transact-sql?view=sql-server-2017
SQL_CALC_FOUND_ROWS
使用此功能时是否等效?
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()
实施时才进行的。
AS xx
对我而言,将OFFSET和FETCH一起使用很慢,因此我使用了TOP和OFFSET的组合,如下所示(速度更快):
SELECT TOP 20 * FROM (SELECT columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
注意:如果在同一查询中同时使用TOP和OFFSET,例如:
SELECT TOP 20 columname1, columname2 FROM tablename
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS
然后,您将得到一个错误,因此,要一起使用TOP和OFFSET,需要用子查询将其分开。
如果需要使用SELECT DISTINCT,则查询如下:
SELECT TOP 20 FROM (SELECT DISTINCT columname1, columname2
WHERE <conditions...> ORDER BY columname1 OFFSET 100 ROWS) aliasname
注意: SELECT ROW_NUMBER和DISTINCT的使用对我不起作用。
SELECT TOP 20 id FROM table1 where id > 10 order by date OFFSET 20 rows
,则必须将其转换为SELECT TOP 20 * FROM (SELECT id FROM table1 where id > 10 order by date OFFSET 20 ROWS) t1
。我将编辑我的答案。谢谢,请原谅我的英语。
另一个样本:
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;
有此有关此功能在SQL 2011,其悲伤他们选择有点不同的关键字“OFFSET / FETCH”,但它不是非标准然后确定人家讲。
在Aaronaught的解决方案上稍加改动,我通常参数化页码(@PageNum)和页面大小(@PageSize)。这样,每个页面单击事件仅发送请求的页码以及可配置的页面大小:
begin
with My_CTE as
(
SELECT col1,
ROW_NUMBER() OVER(ORDER BY col1) AS row_number
FROM
My_Table
WHERE
<<<whatever>>>
)
select * from My_CTE
WHERE RowNum BETWEEN (@PageNum - 1) * (@PageSize + 1)
AND @PageNum * @PageSize
end
@nombre_row :nombre ligne par page
@page:numero de la page
//--------------code sql---------------
declare @page int,@nombre_row int;
set @page='2';
set @nombre_row=5;
SELECT *
FROM ( SELECT ROW_NUMBER() OVER ( ORDER BY etudiant_ID ) AS RowNum, *
FROM etudiant
) AS RowConstrainedResult
WHERE RowNum >= ((@page-1)*@nombre_row)+1
AND RowNum < ((@page)*@nombre_row)+1
ORDER BY RowNum
由于尚无人提供此代码:
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...
要点:
@limit
可以替换为要检索的结果数,@offset
是要跳过的结果数where
并order by
条款,如果不同步,将提供错误的结果order by
是否明确需要特别是对于SQL-SERVER,您可以通过许多不同的方式来实现。对于给定的真实示例,我们在此处采用了Customer表。
示例1:使用“ SET ROWCOUNT”
SET ROWCOUNT 10
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName
要返回所有行,请将ROWCOUNT设置为0
SET ROWCOUNT 0
SELECT CustomerID, CompanyName from Customers
ORDER BY CompanyName
示例2:使用“ ROW_NUMBER和OVER”
With Cust AS
( SELECT CustomerID, CompanyName,
ROW_NUMBER() OVER (order by CompanyName) as RowNumber
FROM Customers )
select *
from Cust
Where RowNumber Between 0 and 10
示例3:使用“ OFFSET and FETCH”,但是使用此“ ORDER BY”是强制性的
SELECT CustomerID, CompanyName FROM Customers
ORDER BY CompanyName
OFFSET 0 ROWS
FETCH NEXT 10 ROWS ONLY
希望对您有帮助。
因为,我测试此脚本的次数更多,因此每百万条记录更有用,每页100条具有分页功能的记录更快,我的PC执行此脚本0秒,而与mysql比较则有其自身的限制,并且偏移了4.5秒才能获得结果。
有人可能会错过对Row_Number()总是按特定字段排序的理解。如果我们只需要按顺序定义行,则应使用:
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}
说明: