簡體   English   中英

使用Postgres從多個模式中選擇(檢索)所有記錄

[英]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
這是一種方便的方式來告訴每一行的來源。 細節:

SQL小提琴。

你基本上想要一個聯盟:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM