【问题标题】:How to merge multiple mysql tables in one?如何将多个mysql表合并为一个?
【发布时间】:2011-11-18 13:33:43
【问题描述】:

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

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

有没有墙可以合并表格并保存所有字段(有空字段没关系)?

【问题讨论】:

  • 合并是指根据这121个表的结构创建一个新表,并将它们的数据插入到新创建的表中?
  • 我认为这永远不可能,但出于兴趣,这个核弹的用例是什么?

标签: mysql sql merge


【解决方案1】:

首先,您需要手动创建在所有表中包含所有唯一列的表 将主键放在电子邮件、base_name、位置上。

这种方法的主要问题是,与包含不同数据的相同列的主键匹配的行将被最近的更新覆盖。

您可以为每个表生成插入语句,以下查询将为您提供列列表 通过将 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()

例如:

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 以生成您需要的确切语句,并且适用于所有表。

也许可以放置一个列来显示发生覆盖以及原始列来自何处的事实, 所以你可以手动解决冲突

【讨论】:

  • 只会创建一个空表。你的意思是insert into newtable select .... union ....
  • 您可以通过在 CREATE TABLE 语句末尾添加 SELECT 语句从另一个表创建一个表:请参阅:dev.mysql.com/doc/refman/5.1/en/create-table.html 这是有效的 DDL。
【解决方案2】:

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

  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
  ....

【讨论】:

    【解决方案3】:

    我不知道我是否理解得很好,但我猜你正在寻找加入表格而不是合并它们(对不起,如果我错过了)。我给你举了一个左连接的例子,但是如果你想保留每个表中的每条记录,你需要一个完整的外连接(你必须在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 2021-06-02
      • 2016-04-02
      • 2010-10-06
      • 2011-11-25
      • 2012-02-03
      • 2020-07-19
      相关资源
      最近更新 更多