Access (VBA) - 追加表中尚未包含的记录

Posted

技术标签:

【中文标题】Access (VBA) - 追加表中尚未包含的记录【英文标题】:Access (VBA) - Append Records Not Already In Table 【发布时间】:2017-05-23 16:33:23 【问题描述】:

我已将查询 A、B 附加到表 C。我正在创建基于 C 的报告,但我需要不同的行。现在我可以从 C 中选择不同的行,但我想删除它们(即,表 C 不包含 1,000,000,000+ 记录随着时间​​的推移每次追加),所以报告具有来自 C 的所有唯一记录,过去,现在,未来,直到最终用户删除它们。

我的问题就是这个。有没有办法只将不同的(不附加不同的,而是附加到表不同的)行附加到表 C 中? 如果不能直接使用 VBA?

【问题讨论】:

添加主键或复合键以强制执行唯一值。 很好的建议,但我没有专栏可以提出来。它是一个主文件,因此每列中只有一小部分但仍然存在空值。 只需为要附加的内容构建不同的查询:w3schools.com/sql/sql_distinct.asp 你能在几个字段上添加一个唯一的约束吗?例如。字段 A、B、C 必须同时出现才能唯一。 @Absinthe 但是请注意,选择 Distinct 不会删除表 C 中的行。然后我必须将查询数据保存在某处,这会造成更多麻烦。 【参考方案1】:

使用约束来强制执行此行为,在本例中为(复合)主键:https://support.office.com/en-us/article/Add-or-change-a-table-s-primary-key-in-Access-07b4a84b-0063-4d56-8b00-65f2975e4379

这将确保您无法在表中插入重复的值,这意味着您以后不必删除重复的值。

为使数据集唯一的所有列定义主键。

在添加 pk 或约束之前,请确保清理您的数据,以便删除所有重复的行。最简单的方法可能是创建一个新表并使用当前表中的SELECT DISTINCT .... 填充它。

【讨论】:

正如 Ryan 建议的那样,但这是不可能的。我的一个不同的列有几个空值,但数据可以合法地包含它 @FamousFrik 嗯?您可以将NULL 列作为自然键/唯一约束的一部分。至少,在 SQL Server 上。如果 Access 不允许您这样做,那么您需要以某种方式摆脱 NULL 值。没有什么神奇的方法,如果您不告诉它哪些列构成自然键,Access 就无法猜测“唯一”是什么意思。主键约束也有效,但如果您已经有一个自动编号的 PK 列(您应该),则不能。 另外,您还需要创建约束之前清理您的骗子,否则 Access 将不允许您创建它。 确实,我应该将其包含在我的答案中(将编辑)。至于 NULL 作为唯一约束的一部分:这仅适用于较新版本的 Access(iirc MS Access 2010 及更高版本),我通常建议不要这样做(因为它有点违背了唯一约束的目的......),但从技术上讲,它可能会起作用。【参考方案2】:

考虑使用三个NOT IN, NOT EXISTS, or LEFT JOIN...NULL 查询中的任何一个来附加当前不在该表中的数据。下面假设一个主键 ID 用于 distinctness

INSERT INTO TableC (Column1, Column2, Column3)
SELECT a.Column1, a.Column2, a.Column3
FROM QueryA a
LEFT JOIN TableC c
ON a.ID = c.ID
WHERE c.ID IS NULL;


INSERT INTO TableC (Column1, Column2, Column3)
SELECT a.Column1, a.Column2, a.Column3
FROM QueryA a
WHERE NOT EXISTS
   (SELECT 1 FROM TableC c
    WHERE a.ID = c.ID);


INSERT INTO TableC (Column1, Column2, Column3)
SELECT a.Column1, a.Column2, a.Column3
FROM QueryA a
WHERE a.ID NOT IN
   (SELECT c.ID FROM TableC c);

现在,如果没有单列而是多个字段表示唯一性,请添加到 JOINWHERE 子句:

...
FROM QueryA a
LEFT JOIN TableC c
ON a.Column1 = c.Column1 AND a.Column2 = c.Column2 AND a.Column3 = c.Column3
WHERE a.Column1 IS NULL OR a.Column2 IS NULL OR a.Column3 IS NULL;

...
WHERE NOT EXISTS
   (SELECT 1 FROM TableC c
    WHERE a.Column1 = c.Column1 AND a.Column2 = c.Column2 AND a.Column3 = c.Column3);

...
WHERE a.Column1 NOT IN
   (SELECT c.Column1 FROM TableC c)
AND a.Column2 NOT IN
   (SELECT c.Column2 FROM TableC c)
AND a.Column3 NOT IN
   (SELECT c.Column3 FROM TableC c);

【讨论】:

以上是关于Access (VBA) - 追加表中尚未包含的记录的主要内容,如果未能解决你的问题,请参考以下文章

Access VBA:删除单元格值与 Access 表中的值匹配的 Excel 行

使用 VBA 在 Access 表中插入当前月份的每个日期记录

使用 VBA 将数据从 Excel 导出到 Access

在不使用 VBA/Access 中的内联查询的情况下向表中添加记录

使用 vba 将 xls/csv 文件插入到 access 2007 表中

VBA - Access 03 - 遍历列表框,使用 if 语句进行评估