根据公共表动态选择不同模式中的相同值

时间:2014-04-08 08:04:31

标签: sql postgresql postgresql-9.2

我有一个由多个具有相同结构的模式组成的数据库。这使得能够基于企业来分离数据。因此可能存在多个模式,如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

提前致谢,

1 个答案:

答案 0 :(得分:0)

您只能使用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
);

但是,如果你经常这样做(为了从多个模式中抓取相同的结构化数据),我建议你重新规范化你的结构,只使用一个模式 - 每个表中的一个列是合适的&它指向当前行企业