gpt4 book ai didi

sql - 分页时获取总行数

转载 作者:行者123 更新时间:2023-12-02 07:00:23 24 4
gpt4 key购买 nike

我有一个搜索屏幕,用户可以在其中使用 5 个过滤器进行搜索。
我根据这些过滤器值构建了一个动态查询,一次显示 10 页结果。
这在 SQL2012 中使用 OFFSETFETCH 运行良好,但我使用两个查询来执行此操作。

我想显示 10 个结果显示查询找到的总行数(假设为 1000)。
目前,我通过运行查询两次来实现此目的 - 一次用于查询总计数,然后再次对 10 行进行分页。
有没有更有效的方法来做到这一点?

最佳答案

您不必运行查询两次。

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

基于the chat ,看来你的问题有点复杂 - 除了分页之外,你还对结果应用了 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

关于sql - 分页时获取总行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19125347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com