【问题标题】:Postgres SQL query across different schemas跨不同模式的 Postgresql 查询
【发布时间】:2020-10-18 13:46:01
【问题描述】:

我们有多个模式,我想跨模式运行一个简单的计数查询,例如:

SELECT COUNT(col_x) FROM schema1.table WHENRE col_x IS NOT NULL

我看到我可以通过以下方式获取所有模式:

SELECT schema_name FROM information_schema.schemata

所以通过使用:

set search_path to schema1; 
SELECT COUNT(col_x)
FROM table
WHERE col_x is not NULL;

我能够运行 schema1 的查询

问题是 - 是否可以在循环中运行并将架构名称用作 search_path 的参数并跨所有架构运行查询?或任何其他有效的方法?

【问题讨论】:

标签: sql postgresql


【解决方案1】:

为此,您将需要一些 plpgsql 和动态 SQL。这是一个匿名块用于说明:

do language plpgsql
$$
declare
 v_schema_name text;
 table_row_count bigint;
 sysSchema text[] := array['pg_toast','pg_temp_1','pg_toast_temp_1','pg_catalog','public','information_schema'];
 -- other declarations here
begin
 for v_schema_name in SELECT schema_name FROM information_schema.schemata WHERE (schema_name != ALL(sysSchema)) loop
   begin
     execute format('select count(col_x) from %I.t_table', v_schema_name)
     into table_row_count;
     raise notice 'Schema % count %', v_schema_name, table_row_count;
   exception when others then null;  -- t_table may not exists in some schemata
   end
 -- other statements here
 end loop;
end;
$$;

顺便说一句,WHERE col_x is not NULL 是多余的。

【讨论】:

  • 好像查询成功了,但是会提示'Schema % count %', schema_name, table_row_count;没有打印任何试图运行的东西,而是用同样的东西来提高它我如何验证输出?
  • 请。评论exception 行,看看有什么问题。我编辑了我的答案,格式比替换更适合。
  • 正确 - 错误:列引用“schema_name”不明确第 1 行:从 information_schema.schemata 中选择 schema_name
  • 我的错误。 “schema_name”变量和字段具有相同的名称。编辑了我的答案,将变量更改为“v_schema_name”,现在应该可以了。
  • 我看到了一个大问题。异常处理程序。正如所写,这是一个纯粹的错误。如果发生错误,您的例程将提前终止。这意味着您得到了错误的答案并且无法找出原因。至少记录/打印错误。如果您不准备编写更正代码,那么最好不要捕获异常。
猜你喜欢
  • 2014-04-30
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
相关资源
最近更新 更多