基于公共表从不同模式中动态选择相同的值
Posted
技术标签:
【中文标题】基于公共表从不同模式中动态选择相同的值【英文标题】: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
提前致谢,
【问题讨论】:
【参考方案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
);
但是,如果您经常这样做(从多个架构中抓取相同的结构化数据),我建议您重新规范化您的结构以仅使用一个架构 - 每个表中都有一个适合的列和哪些点到当前行的企业。
【讨论】:
我有类似的解决方案,但我反对使用光标。以上是关于基于公共表从不同模式中动态选择相同的值的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Raw 语句我可以根据列数据是不是等于另一个表从不同的表中进行选择