我正在使用 iBatis
和 SQLServer
,
使用偏移量和限制进行分页查询的最佳方式是什么?
也许我添加列 ROW_NUMBER() OVER (ORDER BY Id) AS RowNum
,但这只会阻止简单查询的数据访问。在某些情况下,我使用选择联合。如何优化这些查询?
最佳答案
我对 ibatis 一无所知,但我猜你可以用 SQL 来做到这一点。
如果我没理解错的话,您想对一个 select 语句或几个 select 语句的并集的结果进行分页。
我会按照以下方式进行。例如,这可能是一个存储过程,并且可能应该在那里进行一些健全性检查,检查偏移量和限制值是否大于 0。如果你最终做了这样的事情,请确保替换 *
还有你的列名!
这是一个联合的例子:
DECLARE @offset INT;
DECLARE @limit INT;
WITH cte
AS (SELECT t.*,
Row_number() OVER (ORDER BY Id) AS RowNum
FROM (SELECT *
FROM Table1
UNION
SELECT *
FROM Table2) t)
SELECT *
FROM cte
WHERE RowNum BETWEEN @offset AND @offset + @limit
基本上,我所做的是从两个查询的联合中派生出一个新表,正如您所说的,在您的情况下可能会发生。然后我将带有行号的列添加到 CTE 中的结果,然后仅选择 @Offset
和 @limit + @offset
中指定的行以仅返回您要求的行。
例如设置 @offset = 50
和 @limit = 50
,您将返回 50-100 的结果(按照 Row_number
中指定的条件排序) > over 子句。
(我希望这就是您要找的那种东西!)
编辑:这仅适用于 SQL Server 2005 及更高版本——您没有提到您使用的是哪个版本!
关于c# - 用于 asp.net 网格分页的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10984768/