我有多个结构完全相同的表(字段:date、id、revenue)。让我们假设我有3个表,每个表有3行,以使其更简单。
每个表之间唯一的变化是后缀,例如:
Myserver.Mytable_name.05112021(我们称之为表1)
Myserver.Mytable_name.06112021(我们称之为表2)
Myserver.Mytable_name.07112021(我们称之为表3)
我想要的是拉这些表中的一些字段,这样我就不必指定后缀
我期望的结果应该如下所示:
| ID|日期|收入|
| --|--|--|
| id_1|日期_1|收入_1|
| id_2|日期_1|收入_1|
| id_3|日期_1|收入_1|
| id_1|日期_2|收入_2|
| id_2|日期_2|收入_2|
| id_3|日期_2|收入_2|
| id_1|日期_3|收入_3|
| id_2|日期_3|收入_3|
| id_3|日期_3|收入_3|
我怎样才能得到上面的结果,而不使用union或union all?
这很重要,因为我的表是每天创建的,我不想为了获取数据而在CTE中手动添加它们。
谢谢你的帮助!
在这种情况下使用union或unionall是很麻烦的
2条答案
按热度按时间hpxqektj1#
你需要
UNION/UNION ALL
来完成这个操作,但是有一种方法可以让你只写一次查询,然后在需要的地方进行编辑,你可以使用PREPARED STATEMENT。下面是一个例子:
字符串
在上面的例子中,你只需要关注查询来生成实际的查询。假设你只想获取特定的日期范围,那么你可以这样做:
型
或者可能数据库/服务器(table_schema)已经改变,或者table_name前缀现在不同了,那么:
型
Demo fiddle
lbsnaicq2#
这很重要,因为我的表是每天创建的,我不想为了获取数据而在CTE中手动添加它们
然后你需要动态地生成SQL。
避免这种情况的另一种方法是创建一些标准视图,这些视图从表中返回数据,但让创建表的进程重新创建视图,这样就可以有一个不需要更改的查询。
在我看来,
Union
是完美的:从手动查询开始:
https://sqlfiddle.com/#!9/afd29a/2
请注意,这里我使用表名的后缀构造了一个日期列
字符串
我不知道在MySQL中有什么函数可以用来返回给定列引用的表名,但是如果我们要使用动态或 * 准备好的语句 *,那就没关系了。
首先,我们可以使用这个查询生成上面的SQL:
型
它返回以下内容:
型
因此,我们可以将所有这些功能整合到一个SP中,下面是一个完整的示例,您可以按照该示例进行操作
https://www.db-fiddle.com/f/4Xiv7XtbhP7d2N5EdqsYg4/0的
型
Schema(MySQL v5.7)
| 日期|ID|收入|
| --|--|--|
| 2021-11-05| 1 |50.10|
| 2021-11-05| 2 |135.10|
| 2021-11-05| 3 |三十五点七五|
| 2021-11-06 2021-11-06 2021-11-06| 1 |60.10|
| 2021-11-06 2021-11-06 2021-11-06| 2 |136.10|
| 2021-11-06 2021-11-06 2021-11-06| 3 |三十六点七五|
| 2021-11-07 2021-11-07| 1 |70.10|
| 2021-11-07 2021-11-07| 2 |137.10|
| 2021-11-07 2021-11-07| 3 |三十七点七五|
View on DB Fiddle的