我有一个带有一些模式的PostgreSQL数据库,如下所示:
My_Database
|-> Schemas
|-> AccountA
|-> AccountB
|-> AccountC
|-> AccountD
|-> AccountE
.
.
.
|-> AccountZ
所有模式都有一个名为product
的表,其中有一个名为title
的列。我想知道是否可以执行select语句来检索具有特定条件的所有模式的所有记录。
我到目前为止找到的唯一方法是按帐户运行查询帐户,如下所示。
SET search_path TO AccountA;
SELECT title FROM product WHERE title ILIKE '%test%';
架构是动态创建的,因此我不知道它们的名称或存在多少名称。
答案 0 :(得分:7)
使用inheritance @Denis mentioned,这非常简单。也适用于Postgres 8.4。请务必考虑limitations。
基本上,你会有一个主表,我想在一个主模式中:
CREATE TABLE master.product (title text);
各种schemata 中的所有其他表都从它继承,可能会添加更多本地列:
CREATE TABLE a.product (product_id serial PRIMARY KEY, col2 text)
INHERITS (master.product);
CREATE TABLE b.product (product_id serial PRIMARY KEY, col2 text, col3 text)
INHERITS (master.product);
等
表格不必共享相同的名称或架构 然后你可以一举查询所有表格:
SELECT title, tableoid::regclass::text AS source
FROM master.product
WHERE title ILIKE '%test%';
<强> tableoid::regclass::text
强>?
这是一种方便的方式来告诉每一行的来源。详细说明:
答案 1 :(得分:1)
你基本上想要一个联盟:
SELECT title FROM AccountA.product WHERE title ILIKE '%test%'
UNION ALL
SELECT title FROM AccountB.product WHERE title ILIKE '%test%'
UNION ALL
...;
您可以使用动态SQL和目录自动执行此操作,以查找具有产品表的所有AccountXYZ架构。
或者,使用与各个模式中的表类似的表创建一个AllAccounts模式,并使用表继承。
请注意,两者都不会告诉您数据来自哪个架构。在前一种情况下,这很容易添加;除非你添加一个额外的列,否则在后者中并没有那么多。