数据库是mysql/mariadb。
我设计了一个数据库来存储每月的报告。他们的名字是(例如):表1,表2,表3。。。
我想创建函数/过程,它将创建/重新创建包含所有表union(union all)的视图。
比如:
1首先从信息架构中选择所有表名。
SELECT TABLE_NAME from information_schema.`TABLES` where TABLE_NAME like 'table%'
然后我将尝试在某个循环中设置它,以使用第一个查询的结果集。
但我在第一步中遇到了问题,在第一步中,我尝试只合并一个固定表+第一个查询中的一个表,它会向我返回错误。
我试着:
select * from `table4`
UNION
SELECT * from (SELECT TABLE_NAME from information_schema.`TABLES`
where TABLE_NAME like 'table%' limit 1) as dd
它返回错误:使用的select语句有不同的列数,但是当我执行子查询时,我得到一个结果,表的名称正确,当我在from子句中设置该名称而不使用子查询时,它就工作了。
你知道为什么会这样,也许还有一些关于如何实现这种动态联盟的建议。
1条答案
按热度按时间izj3ouym1#
我想稍微推动一下会帮助你找到处理这个问题的正确方法。
首先,正如timbiegeleisen所建议的,继续的方法是使用动态sql,如果在尝试运行查询之前无法绝对确定表名,那么这是唯一的方法。
第二,您正确地认为您需要从查询information\u schema.table开始,这应该使用游标来完成。然后,应该使用该查询的结果构建一个查询字符串,然后准备并执行该字符串。
第三,我认为您在帖子中包含的错误消息专门指的是查询的运行,并不表示monthly表有任何不同。除非每个部分的结果返回相同的列数,否则不能进行并集。
第四,因为我们要动态地构建查询,所以这必须在存储过程中完成,不可能在存储函数中完成。
mysql文档中有关于使用cursor和prepare/execute的好教程,您应该阅读。我下面给出的版本将基于这些例子。我假设唯一的输入参数是模式名(以防服务器上的另一个数据库中碰巧有一些名称类似的表)。