连接名称与模式匹配的表

时间:2015-08-11 13:56:01

标签: sql postgresql

我正在尝试编写一个查询,我想要连接所有名称与特定模式匹配的表。

示例

我有12个表(每月一个),包含每日温度值,我希望在任何日期范围内返回温度(例如,1/26 / 2014-3 / 5/2014)。

我的表格使用模式temperature_m01temperature_m02,...,temperature_m12命名。

我可以通过明确写出每个连接来简单地将所有表连接在一起,但我想要一种更清晰的方式来暗示我想要加入所有表temperature_m*

一旦我知道如何做到这一点,我想我可以添加一些额外的约束,例如只在我需要的范围内加入表格,这可能会略有改进。

到目前为止,我认为最好的方法是使用python为我编写查询,但这似乎也不是特别干净。

2 个答案:

答案 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中放置所需的常用列。 。 。我们又回来为数据创建一个表。这确实是最好的方法。