繁体   English   中英

没有唯一列的处理SQL表

[英]Process SQL Table with no Unique Column

我们有一个表格,用于保存公司内部的互联网使用情况日志。 该表由我们购买的软件填充,我们无法对其表进行任何更改。 该表没有唯一的键或索引(以使其开发人员说的更快的速度写入数据)

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

目前,我正在从该表中读取1000条记录中的数据。 我的问题是保留从表中读取的最后一条记录,因此我可以读取接下来的1000条记录。

解决此问题的最佳方法是什么?

顺便说一句,如果数据库文件很大,软件可能会根据需要删除较早的记录。

根据您的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

根据您对数据被删除的评论,我将执行以下操作。

首先,将数据插入到临时表中:

select *,  row_number() over(order by id) rn
into #temp
from yourtable

然后,您可以根据需要在任何块中按行号选择数据。

select *
from #temp
where rn between 1 and 1000

这也将有所帮助;

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

没有任何索引,您将无法有效地选择“最后”记录。 解决方案将无法扩展。 您不能在同一句子中使用“实时”和“大日志表的重复表扫描”。

实际上,对于每一行都没有任何唯一的标识属性,您甚至无法确定新增内容(证明:例如,您的表中有成千上万个布尔值。您将如何确定哪些是新的?无法将它们区分开来!您无法找出来)。 必须有一些可以使用的东西,例如DateTime, IP的组合。 或者,您可以添加一个IDENTITY列,该列可能对您使用的软件透明。

您使用的软件可能会允许您在某些ID或DateTime列上创建索引,因为这对软件是透明的。 它可能会产生更多的负载,因此请务必对其进行测试(我的猜测:您会很好的)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM