一尘不染

在分页时获取总行数

sql

我有一个搜索屏幕,用户可以在其中搜索5个过滤器。
我基于这些过滤器值构造了一个动态查询,并一次获得了第10页的结果。
在使用OFFSET和的SQL2012中,此方法工作正常FETCH,但我正在使用 两个 查询来执行此操作。

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


阅读 117

收藏
2021-03-17

共1个答案

一尘不染

您不必两次运行查询。

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

根据聊天记录,您的问题似乎更加复杂-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;

清理:

DROP TABLE dbo.PagingSample;
GO
2021-03-17