我需要编写如下的查询,该查询将绑定到网格
select top 25 * from ErrTable Order by DateErrorad Desc
但是,我需要编写此查询以一次只返回25条记录,但是当用户单击下一条时,它将显示数据库中接下来的25条最新记录。
我怎么能做到这一点?
答案 0 :(得分:3)
您可以使用ROW_NUMBER()实现“分页”技术,如本文所述:http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx
答案 1 :(得分:2)
好的,因为我不知道什么是数据库服务器/引擎,但基本上你需要一个范围(在你的情况下是25)和一个页码(例如0是第一页,1是25个记录的下一页,等等)
在MySQL中,你可以这样做(使用LIMIT命令)....
SELECT * FROM TABLE LIMIT START, RANGE;
Wher TABLE
是您的表名,START
是您的起始索引/范围,例如,如果您有记录0 - 24,则可以设置start = 25,以读取下一个25(这是RANGE
发挥作用的地方。
这仅适用于MySQL,但在DB2中却有所不同。找出您的数据库服务器/引擎处理分页的人。
在DB2中:
SELECT * FROM TABLE FETCH FIRST N ROW ONLY;
其中N
是数值。
编辑对于MSSQL,您可以看到另一个相关帖子:
这是一篇展示Paging in ASP.NET的文章。
答案 2 :(得分:0)
您可以使用LIMIT命令选择给定范围内的条目。但是,我不确定是否所有引擎都支持它,所以更通用的解决方案(尽管效率不高,我估计)是......
SELECT TOP 25 *
FROM YOURTABLE
WHERE IDCOL NOT IN (SELECT TOP 25 * FROM YOURTABLE)
很抱歉定义松散,我要离开了,不能更详细地回答。
答案 3 :(得分:0)
在MySQL中你可以用LIMIT做到这一点,在MSSQL中我不知道是否有效。
SELECT * FROM table LIMIT 10
或
SELECT * FROM table LIMIT 0, 10
这将显示数据库中的前10个结果。
SELECT * FROM table LIMIT 5, 5
这将显示记录6到10
答案 4 :(得分:0)
假设您正在使用SQL Server(基于ASP.NET标记):
declare @offset int
set @offset = 25
select * from (
select *, row_number() over (order by DateErrorad desc) as i from ErrTable
) a
where i <= @offset + 25 and i > @offset
我强烈建议您使用ORM。我喜欢LINQ-to-SQL(它是ASP.NET的完美补充),你可以这样做:
var rows = Errors.Skip(offset).Take(25);
答案 5 :(得分:0)
我想这取决于您的DBMS,以下LINQ2SQL查询
(来自AdventureWorks的表DatabaseLogs
)
using (DataClasses1DataContext context = new DataClasses1DataContext())
{
context.Log = Console.Out;
var qq3 = context.DatabaseLogs.Skip(20).Take(10).ToList();
}
为MSSQL生成以下查询
SELECT [t1].[DatabaseLogID], [t1].[PostTime], [t1].[DatabaseUser], [t1].[Event], [t1].[Schema] AS [Schema], [t1].[Object], [t1].[TSQL], [t1].[XmlEvent]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[DatabaseLogID], [t0].[PostTime], [t0].[DatabaseUser], [t0].[Event], [t0].[Schema], [t0].[Object], [t0].[TSQL]) AS [ROW_NUMBER], [t0].[DatabaseLogID], [t0].[PostTime], [t0].[DatabaseUser], [t0].[Event], [t0].[Schema], [t0].[Object], [t0].[TSQL], [t0].[XmlEvent]
FROM [dbo].[DatabaseLog] AS [t0]
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [20]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [10]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1
答案 6 :(得分:0)
创建存储过程并传递范围
create procedure dbo.SelectWindow
@start int, @end int
as
begin
select *
from
(
select
*,
row_number() (order by ID) as Row
from dbo.table
) a
where Row between @start and @end
end
go