Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 循环模式中的类似表_Sql_Postgresql_Plpgsql_Partitioning_Dynamic Sql - Fatal编程技术网

Sql 循环模式中的类似表

Sql 循环模式中的类似表,sql,postgresql,plpgsql,partitioning,dynamic-sql,Sql,Postgresql,Plpgsql,Partitioning,Dynamic Sql,Postgres9.1-我有一个模式,它将表按月分区,每个月都会创建一个新表,所有列都相同。它没有设置为具有主表的正常分区。我目前正在编写一个相当大的查询,每个月都要运行几次 模式:扩充的_事件 桌子: p201301 2013年1月 p201302 2013年2月 p201303 2013年3月 ... 2013年12月13日至12日 p201401 2014年1月 现在,我必须将我的简化查询写成: select * from augmented_events.p201301 un

Postgres9.1-我有一个模式,它将表按月分区,每个月都会创建一个新表,所有列都相同。它没有设置为具有主表的正常分区。我目前正在编写一个相当大的查询,每个月都要运行几次

模式:扩充的_事件 桌子: p201301 2013年1月 p201302 2013年2月 p201303 2013年3月 ... 2013年12月13日至12日 p201401 2014年1月

现在,我必须将我的简化查询写成:

select *    
from augmented_events.p201301  
union   
select *      
from augmented_events.p201302  
union  
select *      
from augmented_events.p201303  
union  
select *      
from augmented_events.p201312  
union  
select *      
from augmented_events.p201401 

每个月我都要在新的一个月里加入。我想让它更具可扩展性,而不必每个月都重新访问它。是否有一个我可以创建的函数或一个存在的函数,它在增强事件模式中循环遍历每个表,并将其视为我要合并这些表?

我怀疑在纯SQL中可能存在类似的情况,但您可以使用外部代码PHP、Perl、.NET;只要你熟悉。它将查询模式,删除旧视图,然后创建新视图。将它安排为每天运行,您就可以使用该视图,而不必考虑包含哪些表

这是一个创可贴:最好纠正这个伪分区。

正确的解决方案 。。。将通过分区。其实很简单。考虑这个相关的答案:

现在 虽然您的设计很糟糕,但您可以在带有EXECUTE的plpgsql函数中使用动态SQL

创建此函数一次:

在\u模式\u foo中创建或替换函数f\u all\u 返回t的集合 语言plpgsql AS $func$ 开始 返回查询执行 选择字符串\u aggformat'SELECT*FROM%s',c.oid::regclass ,E'\n全部取消\n' 按姓名订购 从pg_名称空间n 在c.relnamespace=n.oid上连接pg_类c 其中n.nspname='foo' 和c.relkind='r' ; 终止 $func$; 请注意,我是如何小心地避免将SQL注入表名称视为用户输入的任何可能性的!。见:

生成并执行表单的查询:

SELECT * FROM foo.p201301 
UNION ALL
SELECT * FROM foo.p201302 
UNION ALL
SELECT * FROM foo.p201303 
UNION ALL
...
由于string_agg中的ORDER by子句,表按名称排序

您可以像使用表一样使用此表函数。电话:

SELECT * FROM f_all_in_schema_foo();
表现应该是好的


您可以在此处找到类似的示例,并提供解释和链接。

不幸的是,我们的DevOps团队已将这些表设置为这样。我不能改变它。欧文有一个以上的解决方案。谢谢。太好了,谢谢你的更新。不要认为继承现在是可行的,我不负责系统,但会和我们的开发团队谈谈。现在,我将使用该函数。