当前位置:  开发笔记 > 编程语言 > 正文

如何使用Microsoft SQL Server实现LIMIT?

如何解决《如何使用MicrosoftSQLServer实现LIMIT?》经验,为你挑选了7个好方法。

我有这个查询与mysql:

select * from table1 LIMIT 10,20

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



1> Leon Tayson..:

启动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;

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

SELECT TOP 10 * FROM (SELECT TOP 20 FROM Table ORDER BY Id) ORDER BY Id DESC


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

2> ceejayoz..:

笨重,但它会奏效.

SELECT TOP 10 * FROM table WHERE id NOT IN (SELECT TOP 10 id FROM table ORDER BY id) FROM table ORDER BY id

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



3> 小智..:

从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

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

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

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



4> Bill Karwin..:

这几乎与我在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;

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



5> Jeremy..:

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

SELECT * 
FROM table1
ORDER BY columnName
  OFFSET 10 ROWS FETCH NEXT 10 ROWS ONLY

注意: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的更多信息,请查看链接



6> Quassnoi..:
SELECT  *
FROM    (
        SELECT  TOP 20
                t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
        FROM    table1 t
        ORDER BY
                field1
        ) t
WHERE   rn > 10



7> 小智..:

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

SELECT * FROM table LIMIT OFFSET, ROW_COUNT

这可以翻译成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

现在您的查询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 

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有