【问题标题】:ASP.NET SQL Server Select top N values but skip M resultsASP.NET SQL Server 选择前 N 个值但跳过 M 个结果
【发布时间】:2011-02-05 11:04:56
【问题描述】:

我正在开发一个 ASP.Net 项目,以在网站上显示来自数据库的信息。我想从新闻表中选择前 10 项,但跳过第一项,我遇到了一些问题。

<asp:SqlDataSource ID="SqlDataSource1" 
                   runat="server" ProviderName="System.Data.SqlClient"
                   ConnectionString="<%$ ConnectionStrings:ClubSiteDB %>" 
                   SelectCommand="SELECT top 5 [id], 
                                               [itemdate], 
                                               [title], 
                                               [description], 
                                               [photo] 
                                  FROM [Announcements] order by itemdate desc">
</asp:SqlDataSource>

这是我目前所拥有的,但我在网上找不到任何关于如何跳过记录的信息

【问题讨论】:

  • 跳过记录是什么意思?您是否只想返回前 10 条记录中的后 9 条,并在 SQL 查询中处理所有这些?

标签: asp.net sql sql-server


【解决方案1】:

对于 SQL Server 2005+,使用:

SELECT x.*
  FROM (SELECT t.id,
               t.itemdate,
               t.title,
               t.description,
               t.photo,
               ROW_NUMBER() OVER (ORDER BY t.itemdate) AS rank
          FROM ANNOUNCEMENTS t) x
 WHERE x.rank BETWEEN a AND b

但是有更好的方法来实现分页,如果这真的是你所追求的。

【讨论】:

    【解决方案2】:

    看看这个问题efficient-way-to-make-paging-on-sql-server-2008的答案中生成的sql

    【讨论】:

      【解决方案3】:

      您可以使用过滤器或在 SQL 中执行:

      SELECT top 10 
            [id], 
            [itemdate], 
            [title], 
            [description], 
            [photo] 
          FROM [Announcements]
          WHERE id <> (select TOP 1 id from announcements order by itemdate desc)
          order by itemdate desc    
      

      编辑:我从字面上理解了“跳过第一个项目”。也许你不是这个意思?

      【讨论】:

      • 是的,这很完美,正是我想要的。谢谢
      • 如果您的数据集达到数千个,此查询将产生灾难性的性能结果。对于 100 条记录,这将是一个丑陋的解决方案,但它会起作用。任何时候你在 where 子句中放一些东西,它都会被执行的次数与必须比较的记录一样多。在这种情况下,您将为表中的每条记录执行(按 itemdate desc 从公告顺序中选择 TOP 1 id)。更不用说这个子选择在整个表上都有一个 order by,这很昂贵。
      • @DidierDotNet 您将如何提高性能,以及如何使这段代码更优雅(而不是丑陋)?注意我认为丑陋和性能是不同的东西。有时你有优雅的代码,但表现不佳或丑陋的代码表现良好。有兴趣了解您如何使此代码更优雅、性能更好并满足 OP 的要求。
      • 将(select TOP 1 id from Advertisements order by itemdate desc)加入到主表中,并与加入的结果进行比较。
      【解决方案4】:
      DECLARE @topid int
      select @topid = max(id) from announcements group by itemdate, id 
      
      SELECT top 10 [id], [itemdate], [title], [description], [photo]      
      FROM [Announcements] A
      WHERE A.id <> @topid
      order by itemdate desc 
      

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 2023-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 2022-01-23
        • 2015-08-15
        相关资源
        最近更新 更多