我有一个MySQL查询:
select * from table1 LIMIT 10,20
我该如何在SQL Server中实现这个功能?
我有一个MySQL查询:
select * from table1 LIMIT 10,20
我该如何在SQL Server中实现这个功能?
从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
ROW_NUMBER()
,然后再进行过滤。 - Panagiotis Kanavos从 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排序,则返回的结果集与预期的不同。
这是我如何在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
是表格中你想要开始提取的记录/行号,例如:如果表格1中有40条记录,则上述代码将从第10行开始提取。
yy
是你想要从表格中提取的记录/行数。
以前面的例子为基础:如果表格1有40条记录,并且你从第10行开始提取,然后获取下一个10行(yy
)。这意味着上述代码将从表格1的第10行开始提取记录,并在20行结束,因此提取10-20行。
查看链接了解更多关于OFFSET的信息。
这几乎是我去年十月提出的一个问题的重复: 在 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;
SELECT *
FROM (
SELECT TOP 20
t.*, ROW_NUMBER() OVER (ORDER BY field1) AS rn
FROM table1 t
ORDER BY
field1
) t
WHERE rn > 10
SELECT TOP 10 * FROM table;
与
是相同的。SELECT * FROM table LIMIT 0,10;
这篇文章介绍了如何在MsSQL中实现Limit,非常值得一读,特别是评论部分。
在语法上,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
Easy way
MYSQL:
SELECT 'filds' FROM 'table' WHERE 'where' LIMIT 'offset','per_page'
MSSQL:
SELECT 'filds' FROM 'table' WHERE 'where' ORDER BY 'any' OFFSET 'offset'
ROWS FETCH NEXT 'per_page' ROWS ONLY
ORDER BY是必须的
一定要尝试。在下面的查询中,你可以看到group by、order by、跳过行和限制行。
select emp_no , sum(salary_amount) from emp_salary
Group by emp_no
ORDER BY emp_no
OFFSET 5 ROWS -- Skip first 5
FETCH NEXT 10 ROWS ONLY; -- limit to retrieve next 10 row after skiping rows
SELECT * FROM table
致:
CREATE VIEW v_table AS
SELECT ROW_NUMBER() OVER (ORDER BY table_key) AS row,* FROM table
SELECT * FROM v_table WHERE row BETWEEN 10 AND 20
SELECT * FROM v_table WHERE field = 'test' AND row BETWEEN 10 AND 20
WHERE仅限于在第10行到第20行之间的数据(而不是搜索整个数据集并限制输出)。