我有一个访问数据库,其中包含从每天发布的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中的旧记录?
答案 0 :(得分:2)
创建一个DMax
表达式,为每个creation_date
返回最新的ID
。
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]);
答案 1 :(得分:1)
您是否尝试过将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
的索引。然后删除原始表,并在之后用新的替换它,表明您已经确认了正确的记录。
答案 2 :(得分: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)