[英]Select (retrieve) all records from multiple schemas using Postgres
我有一個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%';
模式是動態創建的 ,因此我不知道它們的名稱或存在多少名稱。
像@Denis提到的 繼承 ,這將非常簡單。 也適用於Postgres 8.4。 一定要考慮這些限制 。
基本上,你會有一個主表,我想在一個主模式中:
CREATE TABLE master.product (title text);
各種模式中的所有其他表都繼承自它,可能會添加更多本地列:
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
?
這是一種方便的方式來告訴每一行的來源。 細節:
你基本上想要一個聯盟:
SELECT title FROM AccountA.product WHERE title ILIKE '%test%'
UNION ALL
SELECT title FROM AccountB.product WHERE title ILIKE '%test%'
UNION ALL
...;
您可以使用動態SQL和目錄自動執行此操作,以查找具有products表的所有AccountXYZ架構。
或者,使用與各個模式中的表類似的表創建AllAccounts模式,並使用表繼承。
但請注意,兩者都不會告訴您數據來自哪個架構。 在前一種情況下,這很容易添加; 除非你添加一個額外的列,否則在后者中沒有那么多。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.