Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ASP.NET SQL Server选择前N个值,但跳过M个结果_Asp.net_Sql_Sql Server - Fatal编程技术网

ASP.NET SQL Server选择前N个值,但跳过M个结果

ASP.NET SQL Server选择前N个值,但跳过M个结果,asp.net,sql,sql-server,Asp.net,Sql,Sql Server,我正在做一个ASP.Net项目,在网站上显示数据库中的信息。我想从新闻表中选择前10项,但跳过了第一项,我遇到了一些问题 <asp:SqlDataSource ID="SqlDataSource1" runat="server" ProviderName="System.Data.SqlClient" ConnectionString="<%$ ConnectionStrings:ClubSiteDB %&

我正在做一个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>

这是我目前所掌握的,但我无法在网上找到有关如何跳过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

但是,如果您真正想要的是分页,那么有更好的方法来实现分页。

看看这个问题的答案中生成的sql

您可以使用过滤器或在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    

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

跳过记录是什么意思?您只是想返回前10条记录中的最后9条,并在SQL查询中处理所有这些记录吗?是的,这是完美的,正是我想要的。感谢如果您的数据集达到数千个,此查询将产生灾难性的性能结果。对于100张唱片来说,这将是一个丑陋的解决方案,但它会奏效。无论何时,只要您在where子句中放入某个内容,它的执行次数将与必须进行比较的记录的执行次数相同。在这种情况下,您将为表中的每条记录执行select TOP 1 id from announcements order by itemdate desc。更不用说这个子选择在整个表上都有一个order by,这是非常昂贵的。@DidierDotNet您将如何提高性能,以及如何使此代码更优雅而不丑陋?注:我认为UGLYNY和性能是不同的事情。有时,您的代码很优雅,但执行得很差,或者执行得很好的代码很难看。将有兴趣了解如何使此代码更优雅、性能更好并满足OP的要求。将从公告中按itemdate desc排序的select TOP 1 id放入到主表的联接中,并与联接的结果进行比较。
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