Access - 合并两个具有相同结构的数据库

Access - 合并两个具有相同结构的数据库

我想编写一个查询,将两个 Access 2000 数据库合并为一个。每个数据库都有 35 个具有相同字段的表,并且大多唯一数据。有些行具有相同的“主键”,在这种情况下,数据库 A 中的行应始终优先于数据库 B。我在“主键”两边使用引号,因为数据库是在没有任何键或关系的情况下生成的。例如:

数据库 A,表 1

col1    col2
Frank   red
Debbie  blue

数据库 B,表 1

col1    col2
Harry   orange
Debbie  pink

我想要的结果:

col1    col2
Frank   red
Harry   orange
Debbie  blue

这些数据库是由不懂 SQL 的用户生成和下载的,所以我只想给他们一个查询来复制和粘贴。他们显然必须先将一个数据库导入或链接到另一个数据库。

我猜我必须用合并的结果查询创建第三个表,然后删除其他两个表。不过,理想情况下,它只需获取数据库 B 的表并添加数据库 A 的表(必要时覆盖)。

我当然不是在寻找完整的答案,只是希望得到一些关于从哪里开始的建议。我有一些 mySQL 经验,并且了解连接的基础知识。是否可以在一个查询中完成所有这些操作,还是我必须为每个表单独创建一个查询?

答案1

我不熟悉访问,但在通用 SQL 中我会这样做:

SELECT col1, col2 from TableA
UNION
SELECT col1, col2 from TableB where col1 not in (select col1 from TableA)

这将优先考虑 TableA 中的 Debbie。基本上,您将使用以下方法将整个两个表一个接一个地连接起来:联盟但是在添加 TableB 之前,您要从 TableA 中已经存在的 col1 内容中删除它。

编辑:我只是在谈论连接 2 个表,而不是两个数据库。但只要没有冲突关系,您就可以为每个表复制该想法。

EDIT2:如果您希望直接修改 TableA,则可以使用插入(请注意,除非您在新列中添加一些额外信息来跟踪您的操作,否则您无法通过这种方式检索原始 TableA)

INSERT INTO TableA (col1, col2) 
SELECT col1, col2 from TableB 
WHERE col1 not in (select col1 from TableA)

答案2

不幸的是,这不能通过单个查询来完成。

有一些很好的数据库合并工具可以提供帮助:

  • Altova 数据库间谍
  • RedGate SQL 数据比较

显然,如果您的意图是将某些东西提供给客户使用,那么商业工具的许可就会出现问题。

自己编写一个工具总是一个选择,但数据库合并并不是一件简单的操作。你可以看看这个邮政在 stackoverflow 上,讨论了您可能遇到的一些问题。您可能会遇到更糟糕的情况,因为您的数据库没有使用引用完整性检查。您也可以查看ETL 工具。并非专门为合并场景而设计,但您可能会找到可以完成这项工作的东西。

答案3

由于存在外键,您需要跟踪组合表中的旧 PK。在这种情况下,我总是创建一个 OldID 列,并将父记录附加到表中,并将原始 PK 附加到 OldID 字段。然后,我可以使用该 OldID 链接到子记录,并使用新的 PK 值附加它们。

相关内容