2016-07-26 100 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