我有两个mdb文件。 如有必要,我也可以将其转换为MySQL数据库。
如何将这两个不同的dbs合并为一个?
这个想法是从dbs获取所有信息并合并为一个,而不复制任何客户端。 问题是两个bds都有相同的客户端和不同的客户端,但客户端的PK不一样。
每一行都有一个独特的领域,我想它可以以某种方式提供帮助。 知道我该怎么办?
答案 0 :(得分:1)
选择UNION
除PK之外的所有列只会为您提供不同的行:
insert into new_table (<non-pk columns>)
select <non-pk columns> from tableA
union
select <non-pk columns> from tableB
注意:union
会删除重复项。
答案 1 :(得分:1)
我会运行一个UPDATE来填充其中一个表格,并提供所有可用的信息。
假设第一个表具有第二个表具有的所有名称(表2中没有不在表1中的名称值),您应该能够运行以下更新以使第一个表完成:
update tclient1 t join (select name,
max(tel) as tel_filled,
max(address) as add_filled
from (select name, tel, address
from tclient1
union all
select name, tel, address
from tclient2) x
group by name) x on t.name = x.name
set t.tel = x.tel_filled and t.address = x.add_filled;
答案 2 :(得分:0)
更新第二个数据库中的FK,使其唯一,例如:
更新客户端 set id_client = id_client + 100000000;
更新历史记录 设置id_client = id_client + 100000000, id_history = id_history + 10000000;
启用FK以检查完整性
将第二个数据库导出为SQL插入并在第一个数据库中执行。
请使用备份。
答案 3 :(得分:0)
这是一种假设name
是两行之间匹配的方法。它只计算填写的数字并选择适当的来源。此版本使用union all
在where
使用>=
或<
进行比较:
insert into client(id, name, tel, address)
select id, name, tel, address
from db1.client c1
where ((id is not null) + (tel is not null) + (address is not null)) >=
(select (id is not null) + (tel is not null) + (address is not null)
from db2.client c2
where c1.name = c2.name
)
)
union all
select id, name, tel, address
from db2.client c2
where ((id is not null) + (tel is not null) + (address is not null)) >
(select (id is not null) + (tel is not null) + (address is not null)
from db1.client c1
where c2.name = c1.name
)
);
注意:上述版本假设name
在两个表中(如您问题中的示例所示)并且没有重复项。如果不是这种情况,可以很容易地修改它。