我有一个访问数据库,其中包含从每天发布的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