MS SQL Server 2005 中的 LIMIT 样式功能
Posted
技术标签:
【中文标题】MS SQL Server 2005 中的 LIMIT 样式功能【英文标题】:LIMIT style functionality in MS SQL Server 2005 【发布时间】:2011-07-06 06:42:54 【问题描述】:我见过很多非常可怕的方法来做一些事情,比如 mysql 的 MS SQL 的 LIMIT 函数。
任何人都可以提出一个很好的优雅方式来做这样的事情:
SELECT * FROM blah LIMIT 5,15;
但在 MS SQL 中?
干杯!
【问题讨论】:
有趣的是,搜索相关问题在 SO 上的不同情况下是如何工作的。目前,相关列表包含一些问题的链接,这些问题很可能消除对这个问题的需求,即:***.com/questions/603724/…、***.com/questions/2135418/…。然而当我点击并输入这个问题的标题时,相关问题的列表并不相同,而且肯定没有提到的问题那么相关。 是的,我总是仔细查看列表 - 堆栈溢出可能失败? :) 【参考方案1】:SQL Server 相当于 MySQL/PostgreSQL 的 LIMIT 语法是 TOP (SQL Server 2000+),但是TOP doesn't support the offset value...
假设 SQL Server 2005+,使用:
SELECT x.*
FROM (SELECT t.*,
ROW_NUMBER() OVER (ORDER BY ?) AS rank
FROM BLAH t) x
WHERE x.rank BETWEEN 6 AND 20
请注意,您必须为排名定义排序顺序 - 替换“?”使用适当的列。
【讨论】:
我给你打勾了——你的答案和 Sachin Shanbhag 的几乎一样,但你要快一点:p @John Hunt:实际上,Sachin 是第一个,但我坚持我的意见,即 Sachin 的限制实现并不完全是 MySQL 的 LIMIT 在给定等效数据时会产生的结果。【参考方案2】:在 SQL Server 中为 LIMIT 5,15
获得相同的方法之一是使用 ROW_NUMBER()
-
With t As
(
Select ...
, ROW_NUMBER() OVER ( Order By ... ) As Num
From Table
)
Select ...
From t
Where Num Between 5 And 15
【讨论】:
这不是正确的等价物end value based on the offset 来自 Sachin Shanbhag 和 OMG Ponies 的两个非常好的答案,可惜微软不会只实现 LIMIT ......哦,好吧。谢谢! @John Hunt:幸运的是,语法已经过 ANSI'd,但它是FETCH FIRST x ROWS
-- DB2 是目前唯一支持它的语法(据我所知)。以上是关于MS SQL Server 2005 中的 LIMIT 样式功能的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MS Access 2007 或 MS SQL Server 2005 中通过 SQL 将字段转换为行
使用 MS Access 2003 连接到 SQL Server 2005
MS SQL Server 2005 - 存储过程“自发中断”
使用 MS SQL Server 2005,如何将详细记录合并到一个逗号分隔的列表中