我一直在阅读有关SQL SERVER的LIMIT子句替代品的大量内容。令人沮丧的是,他们仍然拒绝改编它。无论如何,我真的无法理解这一点。我试图转换的查询是这个......
SELECT ID, Name, Price, Image FROM Products ORDER BY ID ASC LIMIT $start_from, $items_on_page
非常感谢任何帮助,谢谢。
答案 0 :(得分:25)
在SQL Server 2012中,支持ANSI标准OFFSET
/ FETCH
语法。我blogged about this这里是the official doc(这是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()
方法。请参阅this article和follow-on discussion。如果您不在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;
还有许多其他方法可以使这只猫皮肤光滑,这不太可能是最有效的,但语法方面可能是最简单的。我建议您查看我发布的链接以及问题评论中提到的重复建议。
答案 1 :(得分:4)
对于SQL Server 2005和2008 这是一个示例查询,用于从LastName排序的Report表中选择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
答案 2 :(得分:2)
试试这个:
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
行开始,这将为您提供前10
行的14
行。基本上LIMIT 5,10
答案 3 :(得分:1)
您可以使用ROW COUNT:返回受最后一个语句影响的行数。当你没有,你重置rowcont。
SET ROWCOUNT 100
或 你可以尝试使用TOP查询
SELECT TOP 100 * FROM Sometable ORDER BY somecolumn
答案 4 :(得分:-1)
如果您允许应用程序存储大量状态,则可以仅使用TOP items_on_page
执行此操作。您所做的是存储您检索的最后一个项目的ID,并为每个后续查询添加AND ID > [last ID]
。因此,您可以从items_on_page
开始分批获取项目,从每次停止的地方开始。