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,如何将详细记录合并到一个逗号分隔的列表中

MS Access 2003 + 到 SQL Server 2005 的链接表 + Windows 身份验证 = 慢

从 Ms Access Mdb 文件获取数据到 sql server 2005 的最佳方法