mar*_*cgg 158 sql sql-server pagination limit
我正在尝试做类似的事情:
SELECT * FROM table LIMIT 10,20
Run Code Online (Sandbox Code Playgroud)
要么
SELECT * FROM table LIMIT 10 OFFSET 10
Run Code Online (Sandbox Code Playgroud)
但是使用SQL Server
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE row > 5 and row <= 10
Run Code Online (Sandbox Code Playgroud)
我还发现:
SELECT TOP 10 * FROM stuff;
Run Code Online (Sandbox Code Playgroud)
...但这不是我想要做的,因为我无法指定起始限制.
我还有另一种方法吗?
另外,只是好奇,有没有一个理由为什么SQL Server不支持该LIMIT
功能或类似的东西?我不想吝啬,但这听起来像DBMS需要的东西......如果确实如此,那么我很抱歉这么无知!我在过去的5年里一直在使用MySQL和SQL +所以......
Mar*_*ith 132
对于SQL Server 2012 +,您可以使用.
SELECT *
FROM sys.databases
ORDER BY name
OFFSET 5 ROWS
FETCH NEXT 5 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)
Bil*_*win 101
该LIMIT
子句不是标准SQL的一部分.它被MySQL,PostgreSQL和SQLite作为SQL的供应商扩展支持.
其他品牌的数据库可能具有类似的功能(例如TOP
在Microsoft SQL Server中),但这些功能并不总是相同.
TOP
在Microsoft SQL Server中很难使用它来模仿该LIMIT
子句.有些情况下它不起作用.
您展示的解决方案ROW_NUMBER()
在Microsoft SQL Server 2005及更高版本中可用.这是最好的解决方案(目前),仅作为查询的一部分.
另一种解决方案是使用TOP
获取第一个计数 + 偏移行,然后使用API来搜索第一个偏移行.
也可以看看:
KM.*_*KM. 35
如您所见,这是首选的sql server方法:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY name) as row FROM sys.databases
) a WHERE a.row > 5 and a.row <= 10
Run Code Online (Sandbox Code Playgroud)
Jod*_*ell 10
如果您使用SQL Server 2012+投票获得Martin Smith的答案并使用OFFSET
和FETCH NEXT
扩展ORDER BY
,
如果你不幸遇到早期版本,你可以做这样的事情,
WITH Rows AS
(
SELECT
ROW_NUMBER() OVER (ORDER BY [dbo].[SomeColumn]) [Row]
, *
FROM
[dbo].[SomeTable]
)
SELECT TOP 10
*
FROM
Rows
WHERE Row > 10
Run Code Online (Sandbox Code Playgroud)
我相信功能相当于
SELECT * FROM SomeTable LIMIT 10 OFFSET 10 ORDER BY SomeColumn
Run Code Online (Sandbox Code Playgroud)
在MS SQL 2012之前,我知道在TSQL中执行它的最佳表现方式.
如果有很多行,使用临时表而不是CTE可以获得更好的性能.
不幸的是,这ROW_NUMBER()
是你能做的最好的.它实际上更正确,因为a limit
或top
子句的结果在没有某些特定顺序的情况下实际上没有意义.但这仍然是一件痛苦的事情.
更新:Sql Server 2012 limit
通过OFFSET和FETCH关键字添加类似功能.
小智 5
这个怎么样?
SET ROWCOUNT 10
SELECT TOP 20 *
FROM sys.databases
ORDER BY database_id DESC
Run Code Online (Sandbox Code Playgroud)
它为您提供前20行的最后10行.一个缺点是订单是相反的,但至少它很容易记住.
小智 5
SELECT TOP 10 *
FROM TABLE
WHERE IDCOLUMN NOT IN (SELECT TOP 10 IDCOLUMN FROM TABLE)
Run Code Online (Sandbox Code Playgroud)
应给出记录 11-20。如果增加以获得更多页面,可能效率不太高,并且不确定排序会如何影响它。可能必须在两个 WHERE 语句中指定这一点。
归档时间: |
|
查看次数: |
282609 次 |
最近记录: |