MS Access 2010:删除没有主键的重复项

时间:2011-07-21 02:35:32

标签: database excel ms-access

我正在为在Excel电子表格中获取数据但希望将数据导入Access表的客户工作。数据记录的字段是:

-InvoiceNum -发票日期 -顾客 -发货日期 -数量 -项目 -PriceEach

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

有两个问题导致我出现问题:1)数据没有主键(最接近主键的字段是" InvoiceNum"但不幸的是多个记录可以有相同的该字段的字符串); 2)重复记录是可能的,其中"重复记录"我的意思是两个记录对每个字段都有相同的值。

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

我不知道处理这个问题的最佳方法是什么。我希望对以下内容提出一些建议:

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

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

c)是否有另一种选择比上述其他选项更好?

感谢您对此提供的任何帮助!我真的很感激!

2 个答案:

答案 0 :(得分:0)

将其修复到根目录。

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

如果您不能这样做,请在将其导入Access之前删除Excel中的重复项。 (您不必为此编写宏。)由于您将没有重复项,因此能够为目标表建立密钥。最好的情况,你的钥匙是InvoiceNum。在最坏的情况下,密钥将是{InvoiceNum,InvoiceDate,Customer,ShipDate,Quantity,Item,PriceEach}。

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

答案 1 :(得分:0)

如果你不能做@Catcall建议的事情(即修复产生欺骗的过程),我会这样做:

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

  • 使用提供的@HansUp方法导入(即带有IN子句中连接字符串的SQL字符串)。

  • 然后使用LEFT JOIN查询现有发票以查找新发票:

      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

这将为您提供新发票,您可以轻松将其转换为INSERT命令以插入这些记录:

      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
  • 现在,鉴于字段名称很多是重复发票的原因,我确实发生这种情况,因为这是非规范化数据,而且有多个记录的情况实际上是任何包含多个发票项目的发票。在这种情况下,您可能需要创建发票标题表,然后将发票项目插入发票明细表中。我会把它作为一种练习留给读者,因为在它可能不重要的时候用抽象的方式嘲笑它是太多了。