处理没有唯一列的SQL表

时间:2013-01-24 12:17:44

标签: sql sql-server

我们有一张表格可以记录我们公司内部的互联网使用情况。此表由我们购买的软件填写,我们无法对其表格进行任何更改。该表没有唯一的密钥或索引(以便像开发人员所说的那样使数据写入速度更快)

我需要阅读此表中的数据,以创建用户使用互联网的实时报告。

目前我正在以1000条记录的形式从这张表中读取数据。我的问题是保留我从表中读到的最后一条记录,所以我可以阅读接下来的1000条记录。

这个问题的最佳解决方案是什么?

顺便提一下,如果数据库文件大小变大,早期的记录可能会被软件删除。

3 个答案:

答案 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列上创建索引,因为这对软件是透明的。它可能会产生更多的负载,所以一定要测试它(我的猜测:你会没事的。)