6

我正在使用iBatisSQLServer

使用偏移量和限制进行分页查询的最佳方法是什么?

也许我添加了 column ROW_NUMBER() OVER (ORDER BY Id) AS RowNum,但这只会阻止简单查询的数据访问。在某些情况下,我使用选择联合。如何优化这些查询?

4

1 回答 1

1

我对ibatis一无所知,但我想你可以在SQL中做到这一点。

如果我对您的理解正确,您希望对 select 语句或几个 select 语句的联合结果进行分页。

我会按照以下方式进行。例如,这可能是一个存储过程,并且可能应该在那里进行一些健全性检查,检查 offset 和 limit 的值是否大于 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 = 50and ,你会得到 50-100 的结果(按照over 子句@limit = 50中指定的标准排序。Row_number

(我希望这是您正在寻找的那种东西!)

编辑:这仅适用于 SQL Server 2005 及以后的版本 - 您没有提到您使用的是哪个版本!

于 2012-06-12T08:54:39.113 回答