我正在尝试编写一个查询,我想要连接所有名称与特定模式匹配的表。
示例
我有12个表(每月一个),包含每日温度值,我希望在任何日期范围内返回温度(例如,1/26 / 2014-3 / 5/2014)。
我的表格使用模式temperature_m01
,temperature_m02
,...,temperature_m12
命名。
我可以通过明确写出每个连接来简单地将所有表连接在一起,但我想要一种更清晰的方式来暗示我想要加入所有表temperature_m*
。
一旦我知道如何做到这一点,我想我可以添加一些额外的约束,例如只在我需要的范围内加入表格,这可能会略有改进。
到目前为止,我认为最好的方法是使用python为我编写查询,但这似乎也不是特别干净。
答案 0 :(得分:2)
这通常是一种反模式,您应该使用一个表格来指示月份。
但是,您可以创建一个视图来组合您的12个表并查询,就好像它们是您的所有表一样......
CREATE VIEW temperature_all AS (
SELECT 01 AS month_id, * FROM temperature_m01
UNION ALL
SELECT 02 AS month_id, * FROM temperature_m02
UNION ALL
SELECT 03 AS month_id, * FROM temperature_m03
UNION ALL
SELECT 04 AS month_id, * FROM temperature_m04
UNION ALL
SELECT 05 AS month_id, * FROM temperature_m05
UNION ALL
SELECT 06 AS month_id, * FROM temperature_m06
UNION ALL
SELECT 07 AS month_id, * FROM temperature_m07
UNION ALL
SELECT 08 AS month_id, * FROM temperature_m08
UNION ALL
SELECT 09 AS month_id, * FROM temperature_m09
UNION ALL
SELECT 10 AS month_id, * FROM temperature_m10
UNION ALL
SELECT 11 AS month_id, * FROM temperature_m11
UNION ALL
SELECT 12 AS month_id, * FROM temperature_m12
);
SELECT * FROM temperature_all WHERE your_date_field BETWEEN '2014-01-26' AND '2014-03-05';
这与分区的工作方式类似。
答案 1 :(得分:0)
首先,这是一个糟糕的数据结构。您应该将所有数据放在一个表中,并使用表示月份的列。
也就是说,Postgres提供了一些有用的东西。一种是使用视图(如另一个问题中的Matt答案)。
另一种方法是使用inheritance。因此,您可以创建父表,例如temperature_m
,并执行:
alter table temperature_m01 inherits temperature_m;
这允许你这样做:
select . . .
from temperature_m*
但是,为了实现这一点,您必须在temperature_m
中放置所需的常用列。 。 。我们又回来为数据创建一个表。这确实是最好的方法。