c# - 用于 asp.net 网格分页的 SQL 查询

标签 c# asp.net sql-server ibatis

我正在使用 iBatisSQLServer,

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

也许我添加列 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/

相关文章:

c# - 将 C# 代码从 Cassandra .5 迁移到 .6

c# - 带动态列的 GridView - 显示 html

c# - Entity Framework 自定义迁移

c# - Visual Studio Express 用户的数据生成计划有哪些替代方案?

c++ - MSSQL Server 2012 和来自 C++ dll 的扩展存储过程

sql-server - SQL Server : Effects of using 'WITH RECOMPILE' in proc definition?

c# - 为什么我不能使用 Gma.QrCodeNet.Encoding.Windows.Render?

javascript - 使用jquery从ajax响应中提取

c# - 即使虚拟目录允许匿名访问,Web 服务也会出现 "HTTP status 401: Access Denied"错误

sql - 数百个别名/同义词与数据库表的完全限定名称