我想在具有相同列结构的2个表之间对MS Access中的几百个字段进行质量比较。如果列值之间存在任何差异,则将table1中的行替换为table2中的新行。如果table2不再保存table1中存在的行,则应从table1中删除该行。对table1的所有更改都应记录在tableLOGS中。
以例如:
____table1___ _____table2____ __________tableLOGS__________
| pid | A | B | | pid | A | B | | id | pid | A | B | action |
| 1 | 0 | 0 | | 1 | 0 | 0 | | 1 | 1 | 0 | 0 | add |
| 2 | 0 | 0 | | 2 | 0 | 1 | | 2 | 2 | 0 | 0 | add |
| 3 | 0 | 0 |
运行所需的SQL查询后,结果应为:
____table1___ _____table2____ __________tableLOGS__________
| pid | A | B | | pid | A | B | | id | pid | A | B | action |
| 1 | 0 | 0 | | 1 | 0 | 0 | | 1 | 1 | 0 | 0 | add |
| 2 | 0 | 1 | | 2 | 0 | 1 | | 2 | 2 | 0 | 0 | add |
| 3 | 2 | 0 | 1 | edit |
| 4 | 3 | 0 | 0 | delete |
我希望这必须分解为两个单独的查询?
批量比较行和更新更改将更改记录到tableLOGS这似乎是一个相当常见的任务,因此MS Access可能有一种简单的方法来完成此操作?感谢您的帮助! :)
P.S。我也愿意从table1中删除与table2不匹配的行,并从table2中删除INSERT INTO table1。
答案 0 :(得分:0)
这是从内存中我实际上没有运行这个,所以它可能需要一些修复。道歉
从记录更新开始
INSERT INTO TableLogs
SELECT A, B
FROM (
SELECT A, B
FROM table2 t2
INNER JOIN table1 t1 ON t1.pid = t2.pid
AND (t1.A <> t2.a OR t1.B <> t2.B)
WHERE table1.A IS NOT NULL)
然后使用更新的值
更新table1 UPDATE table1
INNER JOIN(
SELECT *
FROM table2 t2
INNER JOIN table1 t1 ON t1.pid = t2.pid
AND (t1.A <> t2.a OR t1.B <> t2.B)
WHERE table1.A IS NOT NULL) t2
ON table1.pid = t2.pid
记录表1中缺少的记录
INSERT INTO tablelogs
SELECT A, B
FROM table2
INNER JOIN table1 t1 ON t1.pid = t2.pid AND (t1.A <> t2.a OR t1.B <> t2.B)
WHERE table1.A IS NOT NULL
从table1中删除缺少的行
DELETE table1
WHERE pid NOT IN
(SELECT pid FROM Table2)
您还可以在table1上设置触发器以更新表日志,但这不是最佳实践。
希望有所帮助,就像我说我还没有运行它一样。