为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL LIMIT子句等效于SQL SERVER

MySQL LIMIT子句等效于SQL SERVER

繁星淼淼 2019-11-02 10:55:32
我一直在大量阅读有关SQL SERVER LIMIT子句的替代方法。太令人沮丧了,他们仍然拒绝适应它。无论如何,我真的没办法解决这个问题。我要转换的查询是这样的...SELECT ID, Name, Price, Image FROM Products ORDER BY ID ASC LIMIT $start_from, $items_on_page任何帮助将不胜感激,谢谢。
查看完整描述

3 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

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

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


查看完整回答
反对 回复 2019-11-02
?
万千封印

TA贡献1891条经验 获得超3个赞

对于SQL Server 2005和2008这是一个示例查询,用于从LastName排序的报表表中选择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


查看完整回答
反对 回复 2019-11-02
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

尝试这个:


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第5th行开始每页放置项目,这将使您在最10上面14几行的最下面一行。实质上LIMIT 5,10


查看完整回答
反对 回复 2019-11-02
  • 3 回答
  • 0 关注
  • 670 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信