如何使用Microsoft SQL Server实现LIMIT?

Big*_*lls 120 sql sql-server migration

我有这个查询与mysql:

select * from table1 LIMIT 10,20
Run Code Online (Sandbox Code Playgroud)

我怎么能用Microsoft sql做到这一点?

Leo*_*son 117

启动SQL SERVER 2005,你可以这样做......

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 10 AND 20;
Run Code Online (Sandbox Code Playgroud)

或类似的2000及以下版本......

SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC
Run Code Online (Sandbox Code Playgroud)

  • 这样一个简单的事情需要由MS再次变得如此困难! (133认同)
  • 如果表中有14行,则第二个查询失败.它为您提供了第5行到第14行,但您需要第11行到第14行.通常,它会导致结果的最后一个"页面"失败,除非总行数是该"页面"大小的倍数. (6认同)

cee*_*yoz 55

笨重,但它会奏效.

SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id
Run Code Online (Sandbox Code Playgroud)

IMO遗漏了LIMIT条款是犯罪行为.你不应该做这种kludgy解决方法.


小智 32

从SQL SERVER 2012开始,您可以使用OFFSET FETCH子句:

USE AdventureWorks;
GO
SELECT SalesOrderID, OrderDate
FROM Sales.SalesOrderHeader 
ORDER BY SalesOrderID
    OFFSET 10 ROWS
    FETCH NEXT 10 ROWS ONLY;
GO
Run Code Online (Sandbox Code Playgroud)

http://msdn.microsoft.com/en-us/library/ms188385(v=sql.110).aspx

当订单依据不唯一时,这可能无法正常工作.

如果将查询修改为ORDER BY OrderDate,则返回的结果集不符合预期.

  • 为什么这不是公认的答案?我们在 **2018** 大声呼喊! (2认同)
  • @船长对了。接受的仍然有效。让我们点赞这个以反映更新。 (2认同)

Bil*_*win 18

这几乎与我在10月份提出的问题重复: 在Microsoft SQL Server 2000中模拟MySQL LIMIT子句

如果您使用的是Microsoft SQL Server 2000,则没有好的解决方案.大多数人不得不求助于在具有IDENTITY主键的临时表中捕获查询结果.然后使用BETWEEN条件查询主键列.

如果您使用的是Microsoft SQL Server 2005或更高版本,那么您将拥有一个ROW_NUMBER()功能,因此您可以获得相同的结果但避免使用临时表.

SELECT t1.*
FROM (
    SELECT ROW_NUMBER OVER(ORDER BY id) AS row, t1.*
    FROM ( ...original SQL query... ) t1
) t2
WHERE t2.row BETWEEN @offset+1 AND @offset+@count;
Run Code Online (Sandbox Code Playgroud)

您也可以将其写为公共表表达式,如@Leon Tayson的回答所示.


Óla*_*age 14

SELECT TOP 10 * FROM table;
Run Code Online (Sandbox Code Playgroud)

是相同的

SELECT * FROM table LIMIT 0,10;
Run Code Online (Sandbox Code Playgroud)

这是一篇关于在 MsSQL 中实现 Limit 的文章,读起来很不错,特别是评论。

  • 这个答案没有回答起源问题,但如果像我这样的人需要知道如何获得前 N 个结果并通过谷歌等到达这里,它是有用的...... (8认同)
  • 谢谢,但我想要10到20之间的记录,有办法做到吗? (2认同)

Jer*_*emy 13

这就是我如何限制MS SQL Server 2012中的结果

SELECT * 
FROM table1
ORDER BY columnName
  OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

注意:OFFSET只能与ORDER BY一起使用或串联使用.

要解释代码行OFFSET xx ROWS FETCH NEXT yy ROW ONLY

"xx"是您要从表中开始拉出的记录/行号.
IE:如果表1中有40条记录.上面的代码将从第10行开始.

"yy"是您要从表中提取的记录/行数.
以前面的例子为基础.
IE:如果表1有40条记录,你开始从第10行拉出并抓住NEXT 10(yy).
这意味着,上面的代码将从第10行开始从第1行拉出记录,从第10行开始,从而拉出第10-20行.

有关OFFSET的更多信息,请查看链接


Qua*_*noi 12

SELECT  *
FROM    (
        SELECT  TOP 20
                t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
        FROM    table1 t
        ORDER BY
                field1
        ) t
WHERE   rn > 10
Run Code Online (Sandbox Code Playgroud)


小智 8

语法上的MySQL LIMIT查询是这样的:

SELECT * FROM table LIMIT OFFSET, ROW_COUNT
Run Code Online (Sandbox Code Playgroud)

这可以翻译成Microsoft SQL Server之类的

SELECT * FROM 
(
    SELECT TOP #{OFFSET+ROW_COUNT} *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
    FROM table
) a
WHERE rnum > OFFSET
Run Code Online (Sandbox Code Playgroud)

现在您的查询select * from table1 LIMIT 10,20将如下所示:

SELECT * FROM 
(
    SELECT TOP 30 *, ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS rnum 
    FROM table1
) a
WHERE rnum > 10 
Run Code Online (Sandbox Code Playgroud)


小智 6

简单的方法

数据库:

SELECT 'filds' FROM 'table' WHERE 'where' LIMIT 'offset','per_page'
Run Code Online (Sandbox Code Playgroud)

SQL:

SELECT 'filds' FROM 'table' WHERE 'where' ORDER BY 'any' OFFSET 'offset' 
ROWS FETCH NEXT 'per_page' ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

ORDER BY 是强制性的