我有这个查询与mysql:
select * from table1 LIMIT 10,20
我怎么能用Microsoft sql做到这一点?
启动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
笨重,但它会奏效.
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解决方法.
从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,则返回的结果集不符合预期.
这几乎与我在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的回答所示.
这就是我如何限制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的更多信息,请查看链接
SELECT * FROM ( SELECT TOP 20 t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn FROM table1 t ORDER BY field1 ) t WHERE rn > 10
语法上的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