访问(VBA) - 附加表中未包含的记录

时间:2017-05-23 16:33:24

标签: sql vba ms-access

我已将查询A,B附加到表C.我正在创建一个基于C的报告,但我需要不同的行。现在我可以从C中选择不同的行,但是我想在我去的时候删除它们(即因此,对于每个附加,表C不包含1,000,000,000+个记录),因此报告具有来自C的所有唯一记录,过去,目前,未来,直到最终用户删除它们。

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

2 个答案:

答案 0 :(得分:0)

使用约束来强制执行此行为,在本例中为(复合)主键: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 ....填充它。

答案 1 :(得分:0)

考虑使用三个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);