sql - 我可以在单个查询中检索分页行和总计数吗?

标签 sql sql-server

我有一个基本网格,在我的网络应用程序中启用了分页。该网格使用 Dapper 通过 Web API 由 SQL 数据填充。在我的 API Controller 中,我运行两个单独的查询:一个用于提取行(显示在我的网格中),一个用于获取记录总数(显示在我的分页控件中)。这有效。但是,我正在尝试优化我的查询。

我的第一个查询提取行,一次仅返回 50 行(使用 OFFSETFETCH 来提供分页:

SELECT DISTINCT T_INDEX.* 
FROM T_INDEX
INNER JOIN T_INDEXCALLER ON T_INDEX.IndexId = T_INDEXCALLER.IndexId
WHERE... --a fairly complex WHERE statement
ORDER BY CallTime DESC
OFFSET (@offset) ROWS FETCH NEXT 50 ROWS ONLY

我的第二个查询提取所有行的计数,但使用相同的表、相同的联接和相同的 WHERE 子句:

SELECT COUNT(DISTINCT T_INDEX.IndexId)
FROM T_INDEX
INNER JOIN T_INDEXCALLER ON T_INDEX.IndexId = T_INDEXCALLER.IndexId
WHERE... --the same fairly complex WHERE statement

正如我所说,这有效。每次查询大约需要 2.5 秒,总计 5 秒以上。无论如何,时间滞后并不是世界末日,但我想将时间缩短一半。

我想知道是否有任何方法可以检索 50 行检索一个查询中所有行的总数。我意识到这两个查询正在做两件不同的事情。但我的想法是,“可能”有一种方法可以调整这两个查询并将它们合并为一个,因为两者之间的表、连接和 WHERE 子句是相同的。

最佳答案

您可以尝试一下此查询:

SELECT *
FROM (
   SELECT *, COUNT(*) OVER () AS cnt
   FROM (
      SELECT DISTINCT T_INDEX.*, 
      FROM T_INDEX
      INNER JOIN T_INDEXCALLER ON T_INDEX.IndexId = T_INDEXCALLER.IndexId
      WHERE... --a fairly complex WHERE statement
   ) AS t1 ) AS t2
ORDER BY CallTime DESC
OFFSET (@offset) ROWS FETCH NEXT 50 ROWS ONLY

您可以根据决定结果集中不同记录的因素来简化上述查询。

关于sql - 我可以在单个查询中检索分页行和总计数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47935479/

相关文章:

python - 为 windows 配置 sqlalchemy

php - 删除重复条目 : Delete a entry that has 2 the same column

MySQL 在 SUM 之后排序

sql-server - DB 中的 Twitter 名称长度

sql-server - 数据库记录锁定

sql-server - sys.dm_exec_query_stats 列描述?

sql - 试图在两行和两列中查找重复值 - SQL Server

sql-server - 使用直接与开发服务器同步的 TFS 2010 的 SQL Server 版本控制

mysql - 用户定义的分配

mysql - 帮助计算具有多个条件的查询计数?