2013-05-27 79 views
1

我有一個訪問數據庫,其中包含從每天發佈的csv文件中提取的記錄。有時會更新現有的記錄。我當前的數據庫的形式是如果存在更新的記錄,則刪除記錄

... ID ... Date on which the csv file was created 
    1    26/05/2013 
    1    27/05/2013 
    2    27/05/2013 
    3    26/05/2013 
etc. 

如何獲得Access刪除VBA中的舊記錄?

回答

2

創建一個DMax表達式,返回每個ID最近的creation_date

DMax("creation_date", "YourTable", "ID=" & <current ID>) 

然後使用該表達的SELECT查詢,以確定您要丟棄行。

SELECT 
    y.ID, 
    y.creation_date, 
    DMax("creation_date", "YourTable", "ID=" & y.ID) 
FROM YourTable AS y; 

一旦你的SELECT查詢正常工作,使用其工作DMax表達在DELETE查詢。

DELETE FROM YourTable 
WHERE creation_date < DMax("creation_date", "YourTable", "ID=" & [ID]); 
+0

我很困惑你的意思是「y」。這是指什麼,我的桌子? – user2395059

+0

我用「y」作爲表名的別名。在那個查詢中你並不需要它。然而,我經常使用一個簡短的別名,因爲Access查詢設計者否則想要用完整的表名限定每個字段......即'YourTable.creation_date'。 – HansUp

+0

在DMax(「creation_date」,「YourTable」,「ID =」&y.ID)這一行中,不應該是DMax(「creation_date」,「YourTable」,「ID =」&) ? – user2395059

1

您是否嘗試過使用deletewhere子句?

delete from t 
    where exists (select 1 from t t2 where t2.id > t.id) 

我並不絕對肯定Access允許您從同一張表中選擇和刪除。如果沒有,那麼你可以把ID放在一個臨時表中並使用它刪除。

說實話,我並不是很激動直接刪除記錄的想法。試着用你想要的記錄創建新表:

select * 
from t 
where exists (select 1 from t t2 where t2.id > t.id) 

這應該工作,假設你有id的索引。然後刪除原始表格,並在之後用新的替換它,您已驗證是否有正確的記錄。

+0

你會如何處理,雖然大的ID範圍? ID實際上從〜100000000 - 〜500000000,在一些表中超過100萬記錄。我會循環每一個在select語句之後插入數字嗎? – user2395059

1

如果您想要一次性刪除所有帶有重複ID的舊記錄,只需執行此SQL即可。

但是,它會要求您有主要或唯一的字段。我添加了一個名爲RecID的字段,它只是一個自動編號字段。

strSQL = "" 
strSQL = strSQL & "DELETE " & vbCrLf 
strSQL = strSQL & " t.recid, " & vbCrLf 
strSQL = strSQL & " t.* " & vbCrLf 
strSQL = strSQL & "FROM t " & vbCrLf 
strSQL = strSQL & "WHERE t.recid NOT IN (SELECT Last(t.recid) AS LastOfRecID " & vbCrLf 
strSQL = strSQL & "      FROM t " & vbCrLf 
strSQL = strSQL & "      GROUP BY t.id)" 

然後你只需做一個Currentdb.Execute(strSQL)

相關問題