如何批量检查MS-Access和日志更改中的重复项?

时间:2016-02-17 19:38:18

标签: sql ms-access logging sql-update

我想在具有相同列结构的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。

1 个答案:

答案 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上设置触发器以更新表日志,但这不是最佳实践。

希望有所帮助,就像我说我还没有运行它一样。