首页 > 解决方案 > 如何加入一组后缀相同的表?

问题描述

所以我不是 MYSQL 专家,我真的需要一些帮助来解决这个问题。我目前有 60 多个表要加入到一个表中,这些表中的数据都不匹配,所以我需要将所有表的行合并到一个表中。如果这是正确的术语,它们确实具有相同的架构,基本上是相同的格式。它们都以相同的后缀“_dir”结尾。

我认为可行的是这样的,

获取相同后缀下的所有表,将表列表中的每个表连接或插入行到main_table中。

我不知道如何在 mysql 中执行此操作,或者是否可能。我知道我可以使用,

SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '%_dir%'

获取所有表的列表,但是如何使用它来遍历每个表?

以下是输入数据的示例:

表格1:

|  NAME  |          INST_NAME              | Drop
| data 1 | 'this is an example instance1   | 1.5 
| data 1 | 'this is an example of instance2| 2.0

表2:

|   NAME |     INST_NAME                   | DROP
| data 2 | 'this is an example instance1   | 3.0 
| data 2 | 'this is an example of instance2| 4.0

输出表:

|  NAME  |      INST_NAME                  | DROP
| data 1 | 'this is an example instance1   | 1.5 
| data 1 | 'this is an example of instance2| 2.0
| data 2 | 'this is an example instance1   | 3.0 
| data 2 | 'this is an example of instance2| 4.0

请注意,我必须对超过 60 个表执行此操作,而不仅仅是 2 个。在同一个数据库中还有其他具有不同信息的表,所以我不能只加入其中的所有表。

标签: mysqlsqlmariadb

解决方案


你真的需要修复你的数据结构。您不应该将数据存储在具有相同结构的表中——这些信息应该全部放在一个表中。那你就不会有这个问题了。

现在,您可以构建一个包含所有数据的视图。您可以使用以下内容为视图生成代码:

SELECT CONCAT('CREATE VIEW vw_dir AS',
              GROUP_CONCAT(REPLACE('SELECT NAME, INST_NAME, `DROP` FROM [T]', '[T]'), TABLE_NAME)
                           SEPARATOR ' UNION ALL '
                          )
             ) as create_view_sql
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE '%_dir%';

然后获取 SQL,运行它,您将拥有一个名为vw_dir. 下次添加表时,您需要删除视图然后重新创建它。

解决了这个问题后,您现在可以开始考虑如何将所有数据放入一个表中,而不会让中间表弄乱您的数据库。


推荐阅读