我们有一张表格可以记录我们公司内部的互联网使用情况。此表由我们购买的软件填写,我们无法对其表格进行任何更改。该表没有唯一的密钥或索引(以便像开发人员所说的那样使数据写入速度更快)
我需要阅读此表中的数据,以创建用户使用互联网的实时报告。
目前我正在以1000条记录的形式从这张表中读取数据。我的问题是保留我从表中读到的最后一条记录,所以我可以阅读接下来的1000条记录。
这个问题的最佳解决方案是什么?
顺便提一下,如果数据库文件大小变大,早期的记录可能会被软件删除。答案 0 :(得分:0)
根据您的SQL Server版本,您可以使用row_number()
。分配row_number()
后,您可以翻阅记录:
select *
from
(
select *,
row_number() over(order by id) rn
from yourtable
) src
where rn between 1 and 1000
然后,当您想要获取下一组记录时,可以将WHERE
子句中的值更改为:
where rn between 1001 and 2000
根据您对数据删除的评论,我会执行以下操作。
首先,将数据插入temptable:
select *, row_number() over(order by id) rn
into #temp
from yourtable
然后,您可以根据需要在任何块中按行号选择数据。
select *
from #temp
where rn between 1 and 1000
答案 1 :(得分:0)
这也有帮助;
declare @numRecords int = 1000 --Number of records needed per request
declare @requestCount int = 0 --Request number starting from 0 and increase 1 by 1
select top (@numRecords) *
from
(
select *, row_number() over(order by id) rn
from yourtable
) T
where rn > @requestCount*@numRecords
编辑:根据评论
CREATE PROCEDURE [dbo].[select_myrecords]
--Number of records needed per request
declare @NumRecords int --(= 1000 )
--Datetime of the LAST RECORD of previous result-set or null for first request
declare @LastDateTime datetime = null
AS
BEGIN
select top (@NumRecords) *
from yourtable
where LOGTime < isnull(@LastDateTime,getdate())
order by LOGTime desc
END
答案 2 :(得分:0)
没有任何索引,您无法有效地选择“最后”记录。解决方案无法扩展。你不能在同一个句子中使用“实时”和“大型记录表的重复表扫描”。
实际上,如果每行没有任何唯一的识别属性,你甚至无法确定什么是新的(证据:说,你有一张满是数千个布尔的表。你怎么决定哪些是新的?他们不能被分开!你无法找到。)。必须有一些你可以使用的东西,比如DateTime, IP
左右的组合。或者,您可以添加IDENTITY
列,该列可能对您使用的软件透明。
您使用的软件可能会容忍您在某些ID或DateTime列上创建索引,因为这对软件是透明的。它可能会产生更多的负载,所以一定要测试它(我的猜测:你会没事的。)