繁体   English   中英

与 SQL SERVER 等效的 MySQL LIMIT 子句

[英]MySQL LIMIT clause equivalent for SQL SERVER

我一直在阅读有关 SQL SERVER 的 LIMIT 子句的替代方案。 令人沮丧的是他们仍然拒绝适应它。 无论如何,我真的无法解决这个问题。 我试图转换的查询是这样的......

SELECT ID, Name, Price, Image FROM Products ORDER BY ID ASC LIMIT $start_from, $items_on_page

任何帮助将不胜感激,谢谢。

在 SQL Server 2012 中,支持 ANSI 标准OFFSET / FETCH语法。 写了关于这个的博客,这里是官方文档(这是ORDER BY的扩展)。 您为 SQL Server 2012 转换的语法将是:

SELECT ID, Name, Price, Image 
  FROM Products 
  ORDER BY ID ASC 
  OFFSET (@start_from - 1) ROWS -- not sure if you need -1
    -- because I don't know how you calculated @start_from
  FETCH NEXT @items_on_page ROWS ONLY;

在此之前,您需要使用各种解决方法,包括ROW_NUMBER()方法。 请参阅本文后续讨论 如果您不在 SQL Server 2012 上,则不能使用标准语法或 MySQL 的非标准LIMIT但可以使用更详细的解决方案,例如:

;WITH o AS
(
    SELECT TOP ((@start_from - 1) + @items_on_page)
         -- again, not sure if you need -1 because I 
         -- don't know how you calculated @start_from
      RowNum = ROW_NUMBER() OVER (ORDER BY ID ASC)
      /* , other columns */
    FROM Products
)
SELECT 
    RowNum
    /* , other columns */
FROM
    o
WHERE
    RowNum >= @start_from
ORDER BY
    RowNum;

有很多其他方法可以给这只猫剥皮,这不太可能是最有效的,但语法方面可能是最简单的。 我建议查看我发布的链接以及问题评论中指出的重复建议。

对于 SQL Server 2005 和 2008 这是一个示例查询,用于从按姓氏排序的报告表中选择 11 到 20 行。

SELECT a.* FROM 
(SELECT *, ROW_NUMBER() OVER (ORDER BY LastName) as row FROM Report) a
WHERE a.row > 10 and a.row <= 20

试试这个:

SELECT TOP $items_on_page ID, Name, Price, Image 
FROM (SELECT TOP $start_from + $items_on_page - 1 * FROM Products ORDER BY ID) as T 
ORDER BY ID DESC

编辑:解释-

没有绕过子查询,但这是一个优雅的解决方案。 假设您希望每页10项目,从第5行开始,这将为您提供前14行中的后10行。 基本上LIMIT 5,10

您可以使用 ROW COUNT :返回受最后一条语句影响的行数。 当你不这样做时,你重置rowcont。

SET ROWCOUNT 100

或者您可以尝试使用 TOP 查询

SELECT TOP 100 * FROM Sometable ORDER BY somecolumn

如果您允许应用程序存储一些状态,则可以仅使用TOP items_on_page来完成此操作。 您所做的是存储您检索到的最后一个项目的 ID,并为每个后续查询添加AND ID > [last ID] 因此,您分批获取items_on_page项目,从每次停止的地方开始。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM