我有一個訪問數據庫,其中包含從每天發佈的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中的舊記錄?
我有一個訪問數據庫,其中包含從每天發佈的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中的舊記錄?
創建一個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]);
您是否嘗試過使用delete
和where
子句?
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
的索引。然後刪除原始表格,並在之後用新的替換它,您已驗證是否有正確的記錄。
你會如何處理,雖然大的ID範圍? ID實際上從〜100000000 - 〜500000000,在一些表中超過100萬記錄。我會循環每一個在select語句之後插入數字嗎? – user2395059
如果您想要一次性刪除所有帶有重複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)
我很困惑你的意思是「y」。這是指什麼,我的桌子? – user2395059
我用「y」作爲表名的別名。在那個查詢中你並不需要它。然而,我經常使用一個簡短的別名,因爲Access查詢設計者否則想要用完整的表名限定每個字段......即'YourTable.creation_date'。 – HansUp
在DMax(「creation_date」,「YourTable」,「ID =」&y.ID)這一行中,不應該是DMax(「creation_date」,「YourTable」,「ID =」&) ? –
user2395059