Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Postgresql Postgres-在多个表上重复选择并连接_Postgresql - Fatal编程技术网

Postgresql Postgres-在多个表上重复选择并连接

Postgresql Postgres-在多个表上重复选择并连接,postgresql,Postgresql,我们使用的产品在不同的表格中存储不同年份的相同数据,即Test2015,Test2016,等等。不幸的是,我没有任何方法影响数据的存储方式 我目前有一个工作查询,可以从表中提取列,并将数据合并到一个数据源中(请参见下面的psuedocode),以便于跨年份分析 目前我只有几年的数据,但随着时间的推移,我们将积累更多的数据。有没有简单的方法可以迭代这种类型的查询而不必重复代码行 干杯, 乔纳森 不,没有简单的方法可以让它自动化。但是,当您说“将数据合并到一个数据源”时,您的意思是创建一个视图吗?如

我们使用的产品在不同的表格中存储不同年份的相同数据,即
Test2015
Test2016
,等等。不幸的是,我没有任何方法影响数据的存储方式

我目前有一个工作查询,可以从表中提取列,并将数据合并到一个数据源中(请参见下面的psuedocode),以便于跨年份分析

目前我只有几年的数据,但随着时间的推移,我们将积累更多的数据。有没有简单的方法可以迭代这种类型的查询而不必重复代码行

干杯, 乔纳森


不,没有简单的方法可以让它自动化。但是,当您说“将数据合并到一个数据源”时,您的意思是创建一个视图吗?如果是这样,那么您只需要每年更新一次视图,以包含新表。如果没有,那么我建议您这样做:

CREATE VIEW TestAll AS
  SELECT * FROM (SELECT Name, Score, Year FROM Test2015) 2015data
  UNION ALL
  SELECT * FROM (SELECT Name, Score, Year FROM Test2016) 2016data;
  -- Add more years as the tables are created
不理想,也不太难维护

在分析中,您现在只需使用
TestAll
视图,如:

SELECT Name, avg(Score)
FROM TestAll
WHERE Year < date_trunc('year', CURRENT_DATE) - 2
GROUP BY Name;
选择名称,平均值(分数)
来自TestAll
其中年份
如果您正在寻找纯SQL解决方案,我认为一个好方法是编写一个存储过程,该过程接受两个参数:开始年份和结束年份,它运行一个查询,选择当前数据库中所有表的名称,并过滤开始年份和结束年份之间的表名。然后使用您感兴趣的表名的存储结果,循环遍历它们,并在您感兴趣的表之间使用UNION ALL生成动态查询。最后运行查询并返回结果。我可以给你写一个MySQL解决方案,但我没有任何postgresql的经验。搜索“动态SQL”和“plpgsql”。特别是查找
execute
。如果不需要正确的外键,可以使用表继承来执行。通过适当的检查约束,您甚至可以让Postgres在查询特定年份时忽略“其他”表:
SELECT Name, avg(Score)
FROM TestAll
WHERE Year < date_trunc('year', CURRENT_DATE) - 2
GROUP BY Name;