Postgres - 基于变量连接表

时间:2018-04-12 12:27:57

标签: postgresql

如果我使用SQLAlchemy或字符串格式化变量创建查询,然后使用Python读取.sql文件,我就能完成我正在寻找的内容。我的查询只会读取我正在尝试使用的特定分区。

SELECT a, b, c, ..., FROM fact_'{date}' 

LEFT JOIN dimension_a_'{date}' 

LEFT JOIN dimension_b_'{date}'

有没有办法将变量直接传递给Postgres查询或视图?这些表每天都被分区,如果我试图盲目地加入主表,即使我指定了一个日期,我也会耗尽共享内存。

我希望有办法说出来

SELECT * FROM view WHERE report_date = '2018-01-02'

并将2018-01-02添加到表名中,因此我只查看并尝试加入特定分区。

1 个答案:

答案 0 :(得分:0)

我将在下面提供一个可能的解决方案,但请注意,这几乎肯定不是您想要的路线。您正在解决的问题已经通过分区在数据库级别得到了优雅和有效的解决。请仔细阅读Postgresql's documentation

同时,要回答提出的问题,请注意,在我知道的任何数据库中都没有实现DB服务器为您插入的动态表名:您需要向该服务器发送一个新的查询。每次都有数据库引擎。 (一般来说,鉴于DB理论的一些知识,这实际上是有道理的,但这不在此响应的范围内。)一种可能的解决方法是动态创建VIEW,然后查询这些:

SELECT * FROM view_2018_01_02;

不理想,仍然需要在DB之上的级别进行插值,但需要选项。

更直接地回答您的问题可能会使用数据库功能:

CREATE OR REPLACE FUNCTION trench_report_date_func(rdate TEXT)
  RETURNS TABLE(a AS ..., b AS ...)
AS $$
BEGIN
    RETURN QUERY EXECUTE 'SELECT ... FROM '
      || 'fact_' || rdate
      || ' LEFT JOIN dimension_a_' || rdate
      || ' LEFT JOIN dimension_b_' || rdate;
END;
$$
LANGUAGE plpgsql;

请注意,这确实如上所述,并且每次都向数据库引擎发送新查询。你可以称之为:

SELECT * FROM trench_report_date_func(...);

同样,你可以围绕这种方法解决问题,但我建议你考虑适当的分区。你明智地选择了Postgres;现在利用它的稳健性来发挥你的优势!