在MySQL中将2个不同的表合并为1

时间:2013-06-11 05:31:21

标签: mysql sql

我有两个不同的excel文件,我需要在MySQL中合并到一个表中。我已经将这两个文件导出为CSV并导入到MySQL的两个不同的表中。

第一个表(Central)有:

  

id, name, surname, address, zip, filedA, fieldB, fieldC, fieldD

第二张表(杂志)有:

  

id(不同于“中央”),姓名,地址,邮编,   fieldX,fieldY,fieldZ

目标是建立一个表格:

  

id,name,surname,address,zip,fieldA,fieldB,fieldC,fieldD,   fieldX,fieldY,fieldZ

主要问题是在表“Central”中我有几行(1000),那些是主。在表“杂志”中,我有另一组行(也是1000),但有些行存在于“中央”,有些则不存在。

我想要做的是,一个循环可以创建另一个表,或者使用“Magazine”更新“中央”表,更新两个表中存在的行并为一个表插入新行只存在于“杂志”中。

PK不一样,但我们可以假设对名称,姓氏足以匹配两个表中的行。

由于

2 个答案:

答案 0 :(得分:0)

在新表格中,将name, surname定义为唯一键,以便我们可以使用ON DUPLICATE KEY来检测匹配项。

CREATE TABLE newtable ( /* field definitions */,
  UNIQUE INDEX (name, surname) );

然后首先从Central加载数据:

INSERT INTO newtable (id, name, surname, address, zip, fieldA, fieldB, fieldC, fieldD)
SELECT id, name, surname, address, zip, fieldA, fieldB, fieldC, fieldD
FROM Central;

现在合并来自Magazine的数据,使用新字段更新匹配的行。

INSERT INTO newtable (id, name, surname, address, zip, fieldX, fieldY, fieldZ)
SELECT id, name, surname, address, zip, fieldX, fieldY, fieldZ
FROM Magazine
ON DUPLICATE KEY UPDATE id = VALUES(id), address = VALUES(address),
                        zip = VALUES(zip), fieldX = VALUES(fieldX),
                        fieldY = VALUES(fieldY), fieldZ = VALUES(fieldZ);

可能有一种方法可以在一个INSERT中完成所有操作,但由于MySQL没有CROSS JOIN,因此它将是一个PITA代码。

答案 1 :(得分:0)

create table new_table as select * from (   
 SELECT a.id, a.name, a.surname, a.address, a.zip, a.filedA, a.fieldB, a.fieldC, a.fieldD, b.fieldX, b.fieldY, b.fieldZ FROM Central a
    LEFT JOIN Magazine b ON (a.name = b.name and a.surname = b.surname)
    UNION
    SELECT b.id, b.name, b.surname, b.address, b.zip, a.filedA, a.fieldB, a.fieldC, a.fieldD, b.fieldX, b.fieldY, b.fieldZ FROM Central a
    RIGHT JOIN Magazine b ON (a.name = b.name and a.surname = b.surname) ) temp