分页时获取总行数

use*_*312 15 sql sql-server paging fetch sql-server-2012

我有一个搜索屏幕,用户有5个要搜索的过滤器.
我根据这些过滤器值构建了一个动态查询,并一次构建了第10页结果.
这在SQL2012中正常使用OFFSETFETCH,但我使用两个查询来执行此操作.

我想显示10个结果显示查询找到的总行数(假设为1000).
目前我通过运行两次查询来执行此操作- 一次为总计数,然后再次为10行.
有没有更有效的方法来做到这一点?

Aar*_*and 24

您不必运行两次查询.

SELECT ..., total_count = COUNT(*) OVER()
FROM ...
ORDER BY ...
OFFSET 120 ROWS
FETCH NEXT 10 ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

根据聊天情况,您的问题似乎有点复杂 - DISTINCT除了分页之外,您还要应用结果.这可能会使确定COUNT()应该看起来应该是什么以及它应该去哪里变得复杂.这是一种方式(我只是想证明这一点而不是试图将这种技术融入你聊天中更复杂的查询中):

USE tempdb;
GO
CREATE TABLE dbo.PagingSample(id INT,name SYSNAME);

-- insert 20 rows, 10 x 2 duplicates
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;
INSERT dbo.PagingSample SELECT TOP (10) [object_id], name FROM sys.all_columns;

SELECT COUNT(*) FROM dbo.PagingSample; -- 20

SELECT COUNT(*) FROM (SELECT DISTINCT id, name FROM dbo.PagingSample) AS x; -- 10

SELECT DISTINCT id, name FROM dbo.PagingSample; -- 10 rows

SELECT DISTINCT id, name, COUNT(*) OVER() -- 20 (DISTINCT is not computed yet)
 FROM dbo.PagingSample
 ORDER BY id, name
 OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY; -- 5 rows

-- this returns 5 rows but shows the pre- and post-distinct counts:
SELECT PostDistinctCount = COUNT(*) OVER() -- 10, 
  PreDistinctCount -- 20, 
  id, name 
FROM 
(
  SELECT DISTINCT id, name, PreDistinctCount = COUNT(*) OVER() 
    FROM dbo.PagingSample
    -- INNER JOIN ...
) AS x
ORDER BY id, name
OFFSET (0) ROWS FETCH NEXT (5) ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

清理:

DROP TABLE dbo.PagingSample;
GO
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢Buddy ......你真棒 (3认同)

小智 5

我的解决方案类似于“rs.answer”

DECLARE @PageNumber AS INT, @RowspPage AS INT
SET @PageNumber = 2
SET @RowspPage = 5 

SELECT   COUNT(*) OVER() totalrow_count,*
    FROM databasename
    where columnname like '%abc%'
    ORDER BY columnname
    OFFSET ((@PageNumber - 1) * @RowspPage) ROWS
    FETCH NEXT @RowspPage ROWS ONLY;
Run Code Online (Sandbox Code Playgroud)

返回结果将包含 totalrow_count 作为第一列名称