选择多个表并生成一个新表

时间:2017-08-24 07:33:55

标签: mysql mariadb

也许这个问题已被提出,但我没有找到我搜索过的短语的答案。

我有一个带有以下表格的mariadb(mysql)数据库:

+--------------------------------+                                           
| Tables_in_systemvariablen      |
+--------------------------------+
| items                          |
| lm_energy_l0_0041              |
| lm_energy_l1_0043              |
| lm_energy_l2_0048              |
| lm_energy_l3_0042              |
| lm_energy_p0_0050              |
| lm_energy_p1_0051              |
| lm_energy_p2_0052              |
| lm_energy_p3_0053              |
| lm_energy_pch_0040             |

其中items是数据库中所有条目的列表:

+--------+---------------------------+
| ItemId | itemname                  |
+--------+---------------------------+
|      1 | Sun_Azimuth               |
|      2 | Sun_Elevation             |
|      3 | wkw_gen_p0                |
|      4 | wkw_gen_p1                |
|      5 | wkw_gen_p2                |
|      6 | wkw_gen_p3                |
|      7 | wkw_gen_q0                |
|      8 | wkw_gen_q1                |
|      9 | wkw_gen_q2                |

每个项目都包含存储的值。

+-------------------------+-------+
| time                    | value |
+-------------------------+-------+
| 2017-08-24 02:33:39.531 |   4.2 |
| 2017-08-24 02:34:05.756 |   4.1 |
| 2017-08-24 02:59:07.434 |   4.2 |
| 2017-08-24 02:59:23.811 |   4.1 |
| 2017-08-24 03:02:05.940 |   4.2 |
| 2017-08-24 03:42:47.482 |   4.3 |
| 2017-08-24 03:44:20.967 |   4.2 |
| 2017-08-24 03:44:58.678 |   4.3 |
| 2017-08-24 03:50:31.715 |   4.2 |
| 2017-08-24 03:50:38.273 |   4.3 |

现在我想生成一个输出文件,其中所有项目都会在发生后列出。我在这里找到了几个不同的答案命令,我把它合并到了这个命令中,这也很好。

select a.time, 'lm_energy_p0_0050' , a.value as table_type from lm_energy_p0_0050 a UNION select b.time, 'lm_energy_p1_0051', b.value as table_type from lm_energy_p1_0051 b where time> '2017.08.24 00:00:00.000'  and time<'2017.08.24 23:59:59.999' order by time;

输出看起来像这样(两个项目具有相同的值只是巧合)

+-------------------------+-------------------+------------+
| time                    | lm_energy_p0_0050 | table_type |
+-------------------------+-------------------+------------+
| 2017-08-24 09:17:52.898 | lm_energy_p0_0050 |       1890 |
| 2017-08-24 09:17:52.901 | lm_energy_p1_0051 |       1890 |
| 2017-08-24 09:17:56.920 | lm_energy_p1_0051 |       1878 |
| 2017-08-24 09:17:58.310 | lm_energy_p0_0050 |       1874 |
| 2017-08-24 09:17:58.314 | lm_energy_p1_0051 |       1874 |
| 2017-08-24 09:17:59.631 | lm_energy_p0_0050 |       1871 |
| 2017-08-24 09:17:59.633 | lm_energy_p1_0051 |       1871 |
| 2017-08-24 09:18:00.954 | lm_energy_p1_0051 |       1858 |
| 2017-08-24 09:18:00.954 | lm_energy_p0_0050 |       1862 |
| 2017-08-24 09:18:02.341 | lm_energy_p1_0051 |       1861 |
| 2017-08-24 09:18:02.343 | lm_energy_p0_0050 |       1861 |
| 2017-08-24 09:18:03.667 | lm_energy_p0_0050 |       1856 |
| 2017-08-24 09:18:03.668 | lm_energy_p1_0051 |       1856 |
| 2017-08-24 09:18:04.986 | lm_energy_p0_0050 |       1853 |
| 2017-08-24 09:18:06.377 | lm_energy_p0_0050 |       1852 |
| 2017-08-24 09:18:06.380 | lm_energy_p1_0051 |       1852 |

现在我想为所有项目名生成一个表并将其放入一个文件中。使用以下命令扩展命令时,导出到文件也可以正常工作:

into outfile '/var/lib/mysql-files/output.txt' fields terminated by '|' lines terminated by '\n';

但是使用我当前的命令,我必须分别键入每个项目。我如何修改我的命令,以便包括所有表,但表'项'不是?

1 个答案:

答案 0 :(得分:0)

由于您的各个SELECT语句产生一个硬编码为表名的值,因此您应该使用UNION ALL而不是UNION。

如果UNION的表太多,则MariaDB / MySQL会给出错误消息。

编写SQL来编写SQL是我会考虑的一种方法(称为元编程)

  • 针对INFORMATION_SCHEMA.TABLES编写查询以生成以UNION ALL子句结尾的SELECT语句
  • 使用OUTFILE子句将SQL语句输出到具有SQL扩展名的文件
  • 使用bash或PowerShell(适当的)从文件中剪切尾随的UNION ALL语句,并将结果通过管道传输到新的SQL文件中。
  • mysql -u username -p database_name < your_file.sql
  • 执行新的SQL文件

如果UNION方法的表太多,那么使用类似的方法将数据汇总到一个表中,这次只生成INSERT INTO...SELECT...FROM...WHERE语句。后一种方法的警告是,数据的新近度和刷新期可能会使这在满足用户需求方面变得不切实际。