假设我有3个架构:foo,bar,baz。所以我能做到:
select * from foo.table, bar.table, baz.table;
如果我不想指定模式名称,并且我想在所有模式中选择或者某些用户拥有所有模式,该怎么办?
答案 0 :(得分:3)
如果您的表名称不同(大多数情况下应该是规则),请设置search path:
select * from foo.table1, bar.table2, baz.table3;
set search_path = foo, bar, baz;
select * from table1, table2, table3;
重要提示:使用显式连接而不是在from子句中列出表。
select *
from table1
join table2 on ...
join table3 on ...
如果在多个模式中具有相同名称的表,则可以在函数中引用它们。您需要系统目录中的信息:
此查询列出数据库中 given_table_name 的所有表:
select
n.nspname, c.relname
from
pg_class c
join
pg_namespace n on n.oid = c.relnamespace
where
c.relkind = 'r'
and c.relname = 'given_table_name';
以下功能:
假设您之前已定义了函数 do_something_with_this_table(tablename regclass):
create function do_something_with_all_these_tables(tablename text)
returns void language plpgsql
as $$
declare
schemaname text;
begin
for schemaname in
select n.nspname
from pg_class c
join pg_namespace n on n.oid = c.relnamespace
where c.relkind = 'r' and c.relname = tablename
loop
execute format(
'select do_something_with_this_table(''%s.%s'')',
schemaname, tablename);
end loop;
end $$;
select do_something_with_all_these_tables('given_table_name');
了解更多: