我有一个由多个具有相同结构的模式组成的数据库。这使得能够基于企业来分离数据。因此可能存在多个模式,如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
提前致谢,
答案 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
);
但是,如果你经常这样做(为了从多个模式中抓取相同的结构化数据),我建议你重新规范化你的结构,只使用一个模式 - 每个表中的一个列是合适的&它指向当前行企业。