2016-07-26 57 views
0

我们从外部源获取Access数据库(.accdb),并且无法控制结构或数据。我们需要使用代码将数据提取到我们的数据库中。这意味着我可以控制SQL。使用SQL访问限制记录

我们的问题是,一张表包含近13k条记录(当前12,997条),需要很长时间才能处理。我想查询源数据库中的数据,但一次只能查询预定义数量的记录 - 比如说1000个数据。

我试图在循环内生成我的查询,我更新了每个循环返回的记录数。到目前为止,我发现,接近工作的唯一事情是这样的:

SELECT * 
FROM ( 
     SELECT Top + pageSize + sub.* 
     FROM ( 
       SELECT TOP + startPos + [Product Description Codes].* 
       FROM [Product Description Codes] 
       ORDER BY [Product Description Codes].PRODDESCRIPCODE 
     ) sub 
     ORDER BY sub.PRODDESCRIPCODE DESC 
) subOrdered 
ORDER BY subOrdered.PRODDESCRIPCODE 

我在哪里增加的pageSizestartPos每次循环。问题是它总是返回1000行,即使我认为应该是最后一个循环时它应该只返回997,然后返回零。

任何人都可以帮助我吗?我没有其他列可以过滤。有没有办法在循环中选择一定数量的记录,然后增加该数字,直到获得所有记录,然后停止?

+1

你能澄清一下你的意思吗? 13k记录是什么也不应该慢 –

+0

现在我得到所有13K记录。对于每一个,我的代码都会检查我们数据库中的现有记录。如果有现有记录,则更新;如果没有现有记录,则插入当前的记录。我让它在昨天运行,耗时3437,640毫秒,大约57分钟。这超出了我们的绩效指标。 – Steve

+1

我现在看到您的评论。哇,这很慢。也许你正在做错整个过程。听起来你正在逐一进行操作,只有两个会做? (一个用于更新,一个用于插入) –

回答

0

如果PRODDESCRIPCODE是主键,那么你可以简化你的选择。即:

SELECT TOP 1000 * FROM [Product Description Codes] where PRODDESCRIPCODE> @pcode;

并开始传递0的@pcode参数(如果是int或'if if text等)。在下一个循环中,您可以将参数设置为您收到的最大PRODDESCRIPCODE。

(我不确定你的意思是MS SQL服务器说SQL和你是如何做到这一点的)。

+0

PRODDESCRIPCODE的确是主键。当我说“SQL”时,我的意思是我使用我的代码(这是一种专有格式或Basic)将一个SQL字符串传递给Access。我会稍微尝试一下这个建议并研究N + 1选择问题。 – Steve

+0

哦,你正在传递SQL字符串。那么它是什么语言?你的数据库是什么?你可以直接从你的数据库(服务器端编程)做到这一点。我的意思是关于这个主题的更多细节会好得多。 –

+0

它被称为LIMSBasic,它是我们称为LabWare LIMS的应用程序的专有产品。它与Basic非常相似(但不完全相同)。我可以提供哪些更详细的信息?这是我在这里的第一篇文章,所以我想尽我所能帮助你们全部帮助我。迄今为止,我感谢大家的兴趣。 – Steve

0

您是否绝对需要更新记录,或者您是否可以负担将整个访问表插入本地表,在时间戳字段中打耳光,并构建本地查询以获取最新条目?根据你上面的一些评论,这听起来不像你有什么情况下你在一个导入的记录上保留本地记录。

SELECT PRODDESCRIPCODE, MAX(timestamp) FROM table GROUP BY PRODDESCRIPCODE