如果存在更新的记录,则删除记录

时间:2013-05-27 15:41:47

标签: sql ms-access 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中的旧记录?

3 个答案:

答案 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)

您是否尝试过将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的索引。然后删除原始表,并在之后用新的替换它,表明您已经确认了正确的记录。

答案 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)