Postgresql 9.1 从所有模式中选择

Big*_*Mac 5 postgresql schema

我有一个带有几百个模式的 Postgresql 9.1 数据库。都具有相同的结构,只是数据不同。我需要对表执行选择并从每个模式中获取数据。不幸的是,我还没有找到合适的方法来做到这一点。

我尝试将搜索路径设置为 schema_1、schema_2 等,然后对表执行选择,但它仅从第一个模式中选择数据。

到目前为止,我设法做到的唯一方法是生成一个大查询,例如:

select * from schema_1.table
union
select * from schema_2.table
union
(...another 100 lines....)
Run Code Online (Sandbox Code Playgroud)

有没有其他更合理的方式来做到这一点?如果这是不可能的,我是否可以至少找出哪个模式在该表中有记录而不执行此选择?

Fit*_*ons 2

不同的模式意味着不同的表,因此如果您必须坚持这种结构,那么它将意味着联合,无论是哪种方式。那可能相当昂贵。如果您希望通过搜索路径的便利进行分区,那么反转您的架构可能是有意义的:

在公共模式中存储一个大表,然后在每个单独的模式中提供视图。

看看这个 sqlfiddle 演示了我的概念:

http://sqlfiddle.com/#!12/a326d/1

还内联粘贴以供后代使用,以防 sqlfiddle 无法访问:

架构:

CREATE SCHEMA customer_1;
CREATE SCHEMA customer_2;

CREATE TABLE accounts(id serial, name text, value numeric, customer_id int);
CREATE INDEX ON accounts (customer_id);

CREATE VIEW customer_1.accounts AS SELECT id, name, value FROM public.accounts WHERE customer_id = 1;
CREATE VIEW customer_2.accounts AS SELECT id, name, value FROM public.accounts WHERE customer_id = 2;

INSERT INTO accounts(name, value, customer_id) VALUES('foo', 100, 1);
INSERT INTO accounts(name, value, customer_id) VALUES('bar', 100, 1);
INSERT INTO accounts(name, value, customer_id) VALUES('biz', 150, 2);
INSERT INTO accounts(name, value, customer_id) VALUES('baz', 75, 2);
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT SUM(value) FROM public.accounts;

SET search_path TO 'customer_1';
SELECT * FROM accounts;

SET search_path TO 'customer_2';
SELECT * FROM accounts;
Run Code Online (Sandbox Code Playgroud)

结果:

425
Run Code Online (Sandbox Code Playgroud)
1   foo     100
2   bar     100
Run Code Online (Sandbox Code Playgroud)
3   biz     150
4   baz     75
Run Code Online (Sandbox Code Playgroud)