我有一个搜索屏幕,用户可以在其中搜索5个过滤器。 我基于这些过滤器值构造了一个动态查询,并一次获得了第10页的结果。 在使用OFFSET和的SQL2012中,此方法工作正常FETCH,但我正在使用 两个 查询来执行此操作。
OFFSET
FETCH
我想显示10个结果 并 显示查询找到的总行数(假设为1000)。 目前,我通过运行 两次 查询来执行此操作-一次输入“总数”,然后再次分页显示10行。 有没有更有效的方法可以做到这一点?
您不必两次运行查询。
SELECT ..., total_count = COUNT(*) OVER() FROM ... ORDER BY ... OFFSET 120 ROWS FETCH NEXT 10 ROWS ONLY;
根据聊天记录,您的问题似乎更加复杂-DISTINCT除分页外,您还将应用于结果。这可能会使确定确切的COUNT()外观和位置变得很复杂。这是一种方法(我只是想证明这一点,而不是尝试将该技术结合到聊天中更为复杂的查询中):
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