我有一个包含121个表的Mysql数据库,结构不同,我需要在1个表中合并所有这些表。
所有表格中有3个字段相同(电子邮件,base_name,位置),但某些表格中的所有其他字段都相同,其他字段则不相同。
是否有任何墙可以合并表格并保存所有字段(如果有空字段则无关紧要)?
答案 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