【问题标题】:SQL Server 2017 OFFSET + FETCH - How to know last result was reachedSQL Server 2017 OFFSET + FETCH - 如何知道已达到最后一个结果
【发布时间】:2018-03-11 13:30:25
【问题描述】:

我有一张包含数千个条目的表格。我正在构建一个 Web 应用程序 (Razor C#) 来显示一个包含信息的表格。

我有一个工作的分页系统,但是我找不到知道当前结果集是否有最后一个结果的方法。

我想过这样做:

  • pageNumber * resultPerPage
  • 预做下一页,看看有没有结果

我需要这样做才能隐藏“下一步”按钮。 这是我当前的代码(我将其附加到根据过滤器集构建的查询中):

ORDER BY ID 
OFFSET ((" + page + " - 1) * " + rowsPerPage + ") ROWS
FETCH NEXT " + rowsPerPage + " ROWS ONLY

谢谢!

【问题讨论】:

  • 降序排列。然后最后一个条目是第一行。
  • @lad2025 我知道这一点,但它的限制使我无法访问直接页面。另外,我还需要来回走动。
  • @jdweng 这是一个很酷的想法,但是想象一下:我在最后一页得到 50 个值(我允许 100 个)。然后我将得到最后一个值。结果它得到了一个新条目(刚刚插入)。我允许用户使用下一页按钮。但由于最后一个结果集中只有 50 个项目,“下一页”将显示为空。如果我在返回结果之前检查了最后一个条目,我将不得不检查每个返回的项目以查看它是否与最后一个匹配。而且,如果有一个新条目需要进入一个新页面,用户将不允许点击“下一页”
  • 获取行数。如果您得到 930 行,那么如果每页有 100 行,则最后一页为 30。使用 Mod 函数 930 % 100 = 30。然后使用 TOP(30) 函数。

标签: c# sql sql-server sql-server-2017


【解决方案1】:

跳过OFFSET 子句。跟踪上一个 SELECT 的最后一个 ID。

WHERE ID > last_id_from_previous_select
ORDER BY ID
FETCH NEXT " + rowsPerPage + " ROWS ONLY

【讨论】:

    【解决方案2】:

    在您的请求中再获取一行,即 rowsPerPage+1。 如果返回的结果集包含 rowsPerPage+1 行,您将知道还有更多记录要获取。如果它返回的行数小于或等于 rowsPerPage 行,则不会有更多页面,因此您可以隐藏下一个按钮。 这种方法的唯一成本是您每次会多获得一条记录。

    【讨论】:

    • 为了隐藏那个“奖金”记录,我必须计算我展示了多少,这是每行的一个“如果”......这并不理想。除非有另一种方法我没有看到删除那个奖金
    • 这取决于您如何处理您的记录。在进一步处理之前删除额外的记录。假设,你有这样的代码 ` var records = getPage(page, rowsPerPage); /* 让它成为一个记录数组 */ var isLastPage = records.Count()>rowsPerPage; var recordsToDisplay = isLastPage?records: records.Take(rowsPerPage);
    • @BrunoTeixeira An if per row?
    • 每行是什么意思。恐怕我不明白你需要什么。
    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 2015-09-07
    相关资源
    最近更新 更多