【问题标题】:Select same values from different schema dynamically based on a common table基于公共表从不同模式中动态选择相同的值
【发布时间】:2014-04-08 08:04:30
【问题描述】:

我有一个由具有相同结构的多个模式组成的数据库。这使得能够根据企业隔离数据。所以可能有多个模式,如 db_client1、db_client2 等,并且公共属性定义在公共模式中。有一个这样的通用表,定义如下:

CREATE TABLE enterprises(
    ent_id bigint,
    schema_name character varying
)

需要从一些表中为所有模式选择所有相似信息。因此,对于表企业中的每个条目,我需要从相应的 schema_name 中选择信息。为每个企业触发的查询是

SELECT v1.no, v1.surrogate_id, v2.startdate, v2.enddate  
FROM table1 v1
INNER JOIN table2 v2 on v2.surrogate_id = v1.surrogate_id 

我们需要将 schema_name 附加到来自表企业的上述查询中的每个表。我们如何在不使用任何游标的情况下获取所有企业的所有数据。我正在寻找的示例输出是

ent_id    no        surrogate_id         startdate         enddate
100001    1001      2001                 2014-03-01        2014-03-05
100001    1002      2002                 2014-03-01        2014-03-05
100001    1003      2003                 2014-03-01        2014-03-05
100002    1001      4001                 2014-03-01        2014-03-05
100002    1002      4002                 2014-03-01        2014-03-05
100003    1001      4001                 2014-03-01        2014-03-05
100003    1002      4002                 2014-03-01        2014-03-05
100004    1001      4001                 2014-03-01        2014-03-05
100004    1002      4002                 2014-03-01        2014-03-05

提前致谢,

【问题讨论】:

    标签: sql postgresql postgresql-9.2


    【解决方案1】:

    您只能为此使用 pl/pgsql 存储函数(带有多个 RETURN QUERY EXECUTE)。

    类似:

    CREATE OR REPLACE FUNCTION run_sql_all_enterprises(sql TEXT)
    RETURNS SETOF RECORD
    LANGUAGE plpgsql
    AS $function$
    DECLARE
        row public.enterprises%ROWTYPE;
    BEGIN
        FOR row IN SELECT * FROM public.enterprises LOOP
            RETURN QUERY EXECUTE format(sql, row.schema_name);
        END LOOP;
    END $function$;
    

    你可以这样称呼它

    SELECT * FROM run_sql_all_enterprises($sql$
        SELECT v1.no, v1.surrogate_id, v2.startdate, v2.enddate  
        FROM %1$I.table1 v1
        INNER JOIN %1$I.table2 v2 on v2.surrogate_id = v1.surrogate_id
    $sql$) AS (
        no INT,
        surrogate_id INT,
        startdate DATE,
        enddate DATE
    );
    

    但是,如果您经常这样做(从多个架构中抓取相同的结构化数据),我建议您重新规范化您的结构以仅使用一个架构 - 每个表中都有一个适合的列和哪些点到当前行的企业

    【讨论】:

    • 我有类似的解决方案,但我反对使用光标。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多