我想编写一个查询,将两个 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
答案3
由于存在外键,您需要跟踪组合表中的旧 PK。在这种情况下,我总是创建一个 OldID 列,并将父记录附加到表中,并将原始 PK 附加到 OldID 字段。然后,我可以使用该 OldID 链接到子记录,并使用新的 PK 值附加它们。