基于公共表从不同模式中动态选择相同的值

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 语句我可以根据列数据是不是等于另一个表从不同的表中进行选择

基于主键将两个表从BigQuery导出到CSV

在基于用户的选择中查找所有不同的值 - Excel VBA

如何在具有相同 ID 的列中选择不同的值然后删除它们 PHP SQL Server

设计模式——策略模式

不同对象中具有相同名称的两个变量改变彼此的值