Database MS Access 2010:删除不带主键的重复项

Database MS Access 2010:删除不带主键的重复项,database,excel,ms-access,Database,Excel,Ms Access,我为一个客户工作,他在Excel电子表格中获取数据,但希望将数据导入Access表。数据记录的字段包括: -发票金额 -发票日期 -顾客 -交货日期 -数量 -项目 -价格 他每月接收两次数据,每次接收数据时,他都希望能够将数据导入Access中的表中 有两个问题导致了我的问题:1)数据没有主键(与主键最接近的字段是“InvoiceNum”,但不幸的是,多个记录可能具有此字段的相同字符串);2) 重复记录是可能的,其中“重复记录”是指每个字段具有相同值的两个记录 问题是我们不希望数据表中有重复的

我为一个客户工作,他在Excel电子表格中获取数据,但希望将数据导入Access表。数据记录的字段包括:

-发票金额 -发票日期 -顾客 -交货日期 -数量 -项目 -价格

他每月接收两次数据,每次接收数据时,他都希望能够将数据导入Access中的表中

有两个问题导致了我的问题:1)数据没有主键(与主键最接近的字段是“InvoiceNum”,但不幸的是,多个记录可能具有此字段的相同字符串);2) 重复记录是可能的,其中“重复记录”是指每个字段具有相同值的两个记录

问题是我们不希望数据表中有重复的记录

我不知道处理这件事的最好方法是什么。我希望就以下方面提出一些建议:

a) 我是否应该将所有记录存储在链接到Access表的Excel电子表格中?我在想,如果我这样做,那么我可以将每一组新数据附加到此电子表格(包括重复数据),然后在Excel中编写一个宏来删除重复数据(我注意到我可以通过使用“数据”选项卡上的“删除重复数据”命令来执行此操作)

b) 我应该直接将数据存储在Access表中吗?我可以编写一些VBA程序或宏来将每组新的Excel数据导入Access表,但是否有方法可以消除重复项(同样,表中没有主键)

c) 还有比上述两个更好的选择吗

谢谢你的帮助!我真的很感激

将其固定在根部

问题的根本原因是任何人或软件正在创建包含重复行的Excel电子表格。最好的办法是在数据进入Excel之前消除重复项

如果无法执行此操作,请在将Excel导入Access之前删除其中的重复项。(不必为此编写宏。)因为这样就不会有重复项,所以可以为目标表建立一个键。最好的情况是,您的密钥是InvoiceNum。在最坏的情况下,键将是{InvoiceNum、InvoiceDate、Customer、ShipDate、Quantity、Item、PriceEach}


所有这些都假定重复的内容是没有意义的。如果它们(应该)有意义,那么您需要更多的列。但是,我无法想象这是怎么发生的。

如果你不能按照@Catcall的建议去做(即,修复产生复制的过程),我会这样做:

  • 在Access中创建临时表。它的功能只是为每次导入创建一个缓冲表,并在使用后清除

  • 使用提供的@HansUp方法(即,在in子句中包含connect字符串的SQL字符串)导入

  • 然后使用与现有发票左连接的查询来查找新发票:

选择tblBuffer.InvoiceNum、tblBuffer.InvoiceDate、tblBuffer.Customer、tblBuffer.shippdate、tblBuffer.Quantity、tblBuffer.Item、tblBuffer.PriceEach 从tblBuffer左加入tblInvoices 在tblBuffer.InvoiceNum=tblInvoices.InvoiceNum上 其中tblInvoices.InvoiceNum为空 这将为您提供新发票,您可以轻松地将其转换为插入命令以插入这些记录:

INSERT INTO tblInvoices (InvoiceNum, InvoiceDate, Customer, ShipDate, Quantity, Item, PriceEach) SELECT tblBuffer.InvoiceNum, tblBuffer.InvoiceDate, tblBuffer.Customer, tblBuffer.ShipDate, tblBuffer.Quantity, tblBuffer.Item, tblBuffer.PriceEach FROM tblBuffer LEFT JOIN tblInvoices ON tblBuffer.InvoiceNum = tblInvoices.InvoiceNum WHERE tblInvoices.InvoiceNum Is Null 插入tblInvoices(发票编号、发票日期、客户、发货日期、数量、项目、价格) 选择tblBuffer.InvoiceNum、tblBuffer.InvoiceDate、tblBuffer.Customer、tblBuffer.shippdate、tblBuffer.Quantity、tblBuffer.Item、tblBuffer.PriceEach 从tblBuffer左加入tblInvoices 在tblBuffer.InvoiceNum=tblInvoices.InvoiceNum上 其中tblInvoices.InvoiceNum为空
  • 现在,考虑到字段名,我确实想到,存在许多重复发票的原因是因为这是非规范化数据,并且存在多个记录的情况实际上是任何具有多个发票项的发票。在这种情况下,您可能需要创建发票标题表,然后将发票项目插入发票明细表。我将把它作为一个练习留给读者,因为当它可能根本不重要的时候,抽象地模拟它是太多的工作了

我总是使用缓冲表。它可以更快地揭示错误,而且我觉得使用Access表比使用Excel电子表格更舒服。还有索引等等。 INSERT INTO tblInvoices (InvoiceNum, InvoiceDate, Customer, ShipDate, Quantity, Item, PriceEach) SELECT tblBuffer.InvoiceNum, tblBuffer.InvoiceDate, tblBuffer.Customer, tblBuffer.ShipDate, tblBuffer.Quantity, tblBuffer.Item, tblBuffer.PriceEach FROM tblBuffer LEFT JOIN tblInvoices ON tblBuffer.InvoiceNum = tblInvoices.InvoiceNum WHERE tblInvoices.InvoiceNum Is Null