Seleziona (recupera) tutti i record da più schemi usando Postgres

Ho un database PostgreSQL con alcuni schemi, come di seguito:

My_Database |-> Schemas |-> AccountA |-> AccountB |-> AccountC |-> AccountD |-> AccountE . . . |-> AccountZ 

Tutti gli schemi hanno una tabella chiamata product che ha una colonna chiamata title . Vorrei sapere se è ansible eseguire un’istruzione select per recuperare tutti i record da tutti gli schemi con un certo condizionale.

L’unico modo che ho trovato fino ad ora è di eseguire un account di query per account, come di seguito.

 SET search_path TO AccountA; SELECT title FROM product WHERE title ILIKE '%test%'; 

Gli schemi sono creati dynamicmente , quindi non conosco i loro nomi o quanti di essi esistono.

    Con l’ ereditarietà come @Denis menzionata , questo sarebbe molto semplice. Lavora anche per Postgres 8.4. Assicurati di considerare i limiti .

    Fondamentalmente, avresti una tabella principale, suppongo in uno schema principale:

     CREATE TABLE master.product (title text); 

    E tutte le altre tabelle in vari schemi ereditano da esso, possibilmente aggiungendo più colonne locali:

     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); 

    eccetera.

    Le tabelle non devono condividere lo stesso nome o schema.
    Quindi puoi interrogare tutti i tavoli in un colpo solo:

     SELECT title, tableoid::regclass::text AS source FROM master.product WHERE title ILIKE '%test%'; 

    tableoid::regclass::text ?
    Questo è un modo pratico per dire la fonte di ogni riga. Dettagli:

    • Scopri quale schema si basa sui valori della tabella

    SQL Fiddle.

    Fondamentalmente vuoi un sindacato tutto:

     SELECT title FROM AccountA.product WHERE title ILIKE '%test%' UNION ALL SELECT title FROM AccountB.product WHERE title ILIKE '%test%' UNION ALL ...; 

    Puoi farlo automaticamente utilizzando SQL dinamico e il catalogo per individuare tutti gli schemi AccountXYZ che hanno una tabella prodotti.

    In alternativa, creare uno schema AllAccounts con tabelle simili a quelle dei singoli schemi e utilizzare l’ereditarietà della tabella.

    Nota che nessuno dei due ti dirà da quale schema provengono i dati. Nel primo caso, questo è abbastanza facile da aggiungere; non tanto nel secondo a meno che non aggiungiate una colonna in più.