如何合并多个mysql表?

时间:2011-09-16 09:49:36

标签: mysql sql merge

我有一个包含121个表的Mysql数据库,结构不同,我需要在1个表中合并所有这些表。

所有表格中有3个字段相同(电子邮件,base_name,位置),但某些表格中的所有其他字段都相同,其他字段则不相同。

是否有任何墙可以合并表格并保存所有字段(如果有空字段则无关紧要)?

3 个答案:

答案 0 :(得分:2)

首先,您需要手动创建包含所有表中所有唯一列的表 将主键放在email,base_name,location。

此方法的主要问题是,主键与具有相同列的行匹配的行将包含最新更新。

您可以为每个表生成一个insert语句,以下查询将为您提供列列表 通过比较table1到新表&要更新的列(如果不是空的)。

(更改下面的表格编号以生成每个表格的数据)

SELECT GROUP_CONCAT(NVL(b.COLUMN_NAME,CONCAT('NULL AS ',a.column_name))) as sel_cols
  FROM INFORMATION_SCHEMA.COLUMNS a
  LEFT JOIN INFORMATION_SCHEMA.COLUMNS b ON a.column_name = b.column_name and b.table_name='table1' and b.table_schema = b.table_schema
  WHERE a.table_name = 'new_table' AND b.table_schema = database()

获取要更新的列列表

SELECT GROUP_CONCAT(CASE WHEN b.column_name IS NOT NULL THEN CONCAT(b.column_name,'=VALUES(',b.column_name,')') ELSE END) as upd_cols
  FROM INFORMATION_SCHEMA.COLUMNS a
  LEFT JOIN INFORMATION_SCHEMA.COLUMNS b ON a.column_name = b.column_name and b.table_name='table1' and b.table_schema = b.table_schema
  WHERE a.table_name = 'new_table' AND b.table_schema = database()

e.g:

col1, col2, NULL as col3

col1 = VALUES(col1), col2 = VALUES(col2)

现在粘贴列列表&表名插入插入...

INSERT INTO new_table (select col1,col2,NULL as col3 FROM table1)
ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2)

应该很容易更改sql以生成所需的确切语句,以及所有表。

可能会放一个列,显示已发生过写和原始列来自的位置, 所以你可以手动解决这个问题

答案 1 :(得分:1)

当然你可以合并表格,甚至不是那么困难 以下是3个表的示例,请确保强制union中的所有选择输出相同数量的列:

  SELECT 'table1' as tablename
         , email, basename, location, field1, field2, null, null
  FROM table1
UNION
  SELECT 'table2' as tablename
         , email, basename, location, field1, field2, field3, null
  FROM table2
UNION
  SELECT 'table3' as tablename
         , email, basename, location, field1, null, null, null
  FROM table3
UNION
  ....

答案 2 :(得分:1)

我不知道我是否理解得很好,但我想你想要加入桌子而不是合并它们(对不起,如果我想念你们)。我给你举了一个左连接的例子,但如果你想保留每个表的每条记录,你需要一个完整的外连接(你必须在mysql中模拟它,因为它没有实现)

CREATE TABLE table_name AS (

SELECT * 
  FROM table1 t1
  LEFT JOIN table2 t2 ON t1.email=t2.email AND t1.base_name=t2.base_name AND t1.location=t2.location
  ...
  LEFT JOIN tableN tN ON tN-1.email=tN.email AND tN-1.base_name=tN.base_name AND tN-1.location=tN.location

)

如果你想模拟一个完整的外连接,你应该像这样结合:

SELECT * 
  FROM table1 t1
  LEFT JOIN table2 t2 ON t1.email=t2.email AND t1.base_name=t2.base_name AND t1.location=t2.location
  ...
  LEFT JOIN tableN tN ON tN-1.email=tN.email AND tN-1.base_name=tN.base_name AND tN-1.location=tN.location

UNION

SELECT * 
  FROM tableN tN
  LEFT JOIN tableN-1 tN-1 ON tN.email=tN-1.email AND tN.base_name=tN-1.base_name AND tN-1.location=tN.location
  ...
  LEFT JOIN table1 t1 ON t2.email=t1.email AND t2.base_name=t1.base_name AND t1.location=t2.location