【问题标题】:MS Access 2010: Deleting duplicates without primary keyMS Access 2010:删除没有主键的重复项
【发布时间】:2011-07-23 08:56:52
【问题描述】:

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

-发票编号 -发票日期 -顾客 -发货日期 -数量 -物品 -PriceEach

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

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

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

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

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

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

c) 有没有比上述其他两个更好的选择?

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

【问题讨论】:

    标签: database excel ms-access


    【解决方案1】:

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

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

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

    • 然后对现有发票使用带有 LEFT JOIN 的查询来查找新发票:

     选择 tblBuffer.InvoiceNum, tblBuffer.InvoiceDate, tblBuffer.Customer, tblBuffer.ShipDate, tblBuffer.Quantity, tblBuffer.Item, tblBuffer.PriceEach
          从 tblBuffer 左连接 tblInvoices
            ON tblBuffer.InvoiceNum = tblInvoices.InvoiceNum
          WHERE tblInvoices.InvoiceNum 为空

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

    插入 tblInvoices(InvoiceNum、InvoiceDate、Customer、ShipDate、Quantity、Item、PriceEach) 选择 tblBuffer.InvoiceNum、tblBuffer.InvoiceDate、tblBuffer.Customer、tblBuffer.ShipDate、tblBuffer.Quantity、tblBuffer.Item、tblBuffer.PriceEach 从 tblBuffer 左连接 tblInvoices ON tblBuffer.InvoiceNum = tblInvoices.InvoiceNum WHERE tblInvoices.InvoiceNum 为空
    • 现在,考虑到字段名称,我确实想到之所以有很多重复发票是因为这是非规范化数据,并且有多个记录的情况实际上是任何具有多个发票项目的发票。在这种情况下,您可能需要创建发票抬头表,然后将发票项目插入发票明细表。我将把它作为练习留给读者,因为在它可能无关紧要的情况下,在抽象中模拟它的工作量太大。

    【讨论】:

    • 我总是使用缓冲表。它可以更快地发现错误,而且我感觉使用 Access 表比使用 Excel 电子表格更舒服。还有,索引等等。
    【解决方案2】:

    在根处修复它。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多