我在 PostgreSQL 中收到了数百个结构相同的表,每个表都包含不同日期的相似数据,因此表名是数据的日期。
我想将它们全部合并到一个表中,但不会丢失数据日期这一非常关键的信息。我想我应该以某种方式使用information_schema.tables
和使用我不知道的PL/pgsql,因此应该学习,但老实说,这对于一次性操作来说似乎是一个很大的努力。所以,我的问题是:
有没有一种简单的方法可以实现这一目标,或者最好的解决方案是什么?
我在 PostgreSQL 中收到了数百个结构相同的表,每个表都包含不同日期的相似数据,因此表名是数据的日期。
我想将它们全部合并到一个表中,但不会丢失数据日期这一非常关键的信息。我想我应该以某种方式使用information_schema.tables
和使用我不知道的PL/pgsql,因此应该学习,但老实说,这对于一次性操作来说似乎是一个很大的努力。所以,我的问题是:
有没有一种简单的方法可以实现这一目标,或者最好的解决方案是什么?
如果您想拥有一些自动执行此操作的魔法,您可以使用一个动态创建 select 语句并返回所有表的联合的函数:
然后可以像这样使用上面的函数:
你会得到这样的东西:
如果您想要“data_source”列的不同值,只需在函数内部进行一些模式匹配/替换。
另一种选择是将函数更改为(重新)创建视图(而不是直接返回数据)。这可以使检索更快一些。
您还可以(重新)使用动态 SQL 创建物化视图,以加快检索速度(因为结果会出现在可以正确索引的单个“表”中)。
这可以相当简单和快速:
替换
*
为您想要的列。生成并执行一次这种形式的查询:因此,您会得到一张新表,其中包含所有内容以及源表名称。
解释
DO
语句是一次性操作的不错选择。您不能从中返回值,但可以创建一个新表。您可能想使用一个TEMP TABLE
...tableoid::regclass
用于检索源表的(正确转义的)表名,并且在各种情况下都非常方便。更多详细信息:获取表的所有分区名称
我在单个元查询中构建查询而不是循环,这几乎总是更快更干净(如果可能的话)。相关答案:
遍历模式中的类似表
对目录表的查询通常要快得多,并提供 Postgres 实际拥有的一切。例如
oid
我在这里使用的系统列。除此之外,使用信息模式也有优缺点。大多数情况下,实现跨主要版本和各种 RDBMS 的一些可移植性是有用的。可移植性似乎与一次性操作无关,而且根据我的经验,它几乎无法正常工作。更多内容:如何检查给定模式中是否存在表