【问题标题】:Postgresql Query Across Multiple Schemas跨多个模式的 Postgresql 查询
【发布时间】:2014-04-30 06:03:50
【问题描述】:

我有多个需要查询的模式。模式是事先不知道的,例如:

  • U111
  • U222
  • U333

我需要从每个模式中的特定表中选择这三个模式。我可以将此查询放在这三个模式中吗?如果是这样,我该如何查询它们?请记住,我不会提前知道架构名称,因此需要动态构建它们。

【问题讨论】:

  • 嗯,答案是肯定的。但我猜对你没有多大帮助......

标签: postgresql schema


【解决方案1】:

如果您需要动态构建查询,您有两种选择:准备好的语句和函数。

准备好的语句仅在会话期间有效,当您注销时它会丢失。您使用 PREPARE 语句创建一个准备好的语句,然后您 EXECUTE 它提供参数,例如您的架构名称,为您想要运行它的每个架构一次。

一个函数在数据库中仍然可用以备将来使用。如果您需要将来自不同模式的数据组合到一个结果集中,这是您唯一的选择,您应该定义您的函数以返回 SETOF tablename。它或多或少是这样工作的:

CREATE FUNCTION query_tablename_schemas (schemas name[]) RETURNS SETOF tablename AS $$
DECLARE
  sch name;
BEGIN
  FOREACH sch IN ARRAY schemas LOOP
    RETURN QUERY 'SELECT * FROM ' || quote_ident(sch) || '.tablename WHERE ...';
  END LOOP;
  RETURN;
END;
$$ LANGUAGE plpgsql STRICT;

以上假设您可以在数组中传递您的模式。如果您有一些可以检索架构名称的查询,那么您可以更改循环并执行以下操作:

FOR sch IN
  SELECT schema_name FROM ...
LOOP
  qry := ...
  RETURN QUERY qry;
END LOOP;

在这两种情况下,所有模式中名称为 tablename 的所有表中的记录都会作为一个表返回,然后您可以在其他查​​询中使用该表:

SELECT *
FROM query_tablename_schemas ('{"U111", "U222", "U333"}')
WHERE ...;

【讨论】:

  • 不应该$$ LANGUAGE plpgpsql STRICT;$$ LANGUAGE plpgsql STRICT;
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 2021-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
相关资源
最近更新 更多