ASP.NET SQL Server选择前N个值,但跳过M个结果
我正在做一个ASP.Net项目,在网站上显示数据库中的信息。我想从新闻表中选择前10项,但跳过了第一项,我遇到了一些问题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: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