一尘不染

MySQL LIMIT子句等效于SQL SERVER

mysql

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

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

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


阅读 215

收藏
2020-05-17

共1个答案

一尘不染

在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;

还有很多其他方法可以为这只猫蒙皮,这可能不是最有效的方法,但是从语法角度来说可能是最简单的方法。我建议查看我发布的链接以及对该问题的评论中指出的重复建议。

2020-05-17