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)
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,则返回的结果集不符合预期.
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 的文章,读起来很不错,特别是评论。
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 是强制性的
| 归档时间: |
|
| 查看次数: |
269779 次 |
| 最近记录: |