我已将查询A,B附加到表C.我正在创建一个基于C的报告,但我需要不同的行。现在我可以从C中选择不同的行,但是我想在我去的时候删除它们(即因此,对于每个附加,表C不包含1,000,000,000+个记录),因此报告具有来自C的所有唯一记录,过去,目前,未来,直到最终用户删除它们。
我的问题就是这个。有没有办法只向表C附加不同的(不附加不同,而不是附加到表不同)行? 如果没有直接可能,VBA?
答案 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);
现在,如果没有单个列但多个字段表示唯一性,请添加到JOIN
或WHERE
子句:
...
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);