gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 21:08:56 25 4
gpt4 key购买 nike

我有一个基本网格,在我的网络应用程序中启用了分页。该网格使用 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/

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