2013-05-27 82 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)

相关问题