2011-01-13 21 views
35

È possibile eseguire il comando delle righe JOIN da due database Postgres distinti?Unione di risultati da due database separati

Sto lavorando con un sistema con database di coppia in un server e talvolta ho davvero bisogno di una tale funzionalità.

risposta

42

Secondo http://wiki.postgresql.org/wiki/FAQ

Non v'è alcun modo per interrogare un database diverso da quello attuale. Poiché PostgreSQL carica cataloghi di sistema specifici del database, è incerto su come una query tra database deve anche comportarsi. contrib/dblink consente di eseguire query tra database utilizzando le chiamate di funzione. Per il corso , un client può anche effettuare connessioni simultanee a diversi database e unire i risultati sul lato client.

EDIT: 3 anni dopo (marzo 2014), questa FAQ è stata rivista ed è più utile:

Come si esegue query utilizzando più database?

Non è possibile interrogare direttamente un database diverso da quello attuale . Poiché PostgreSQL carica i cataloghi di sistema specifici del database, è incerto su come dovrebbe funzionare una query tra database.

Il supporto SQL/MED in PostgreSQL consente di creare un "wrapper di dati estranei" su , collegando le tabelle in un database remoto al database locale. Il database remoto potrebbe essere un altro database sulla stessa istanza PostgreSQL o un database a metà strada in tutto il mondo, non importa. postgres_fdw è integrato in PostgreSQL 9.3 e include il supporto di lettura/scrittura ; una versione di sola lettura per 9.2 può essere compilata e installata come un modulo contrib.

contrib/dblink consente query tra database utilizzando le chiamate di funzione e è disponibile per versioni PostgreSQL molto vecchie. A differenza di postgres_fdw , non è possibile "spingere" le condizioni sul server remoto, quindi spesso lo recupera molto più dati del necessario.

Naturalmente, un client può anche effettuare connessioni simultanee a diversi database e unire i risultati sul lato client.

6

No, non è possibile. È possibile utilizzare dblink per connettersi da un database a un altro database, ma ciò non sarà di aiuto se si sta cercando JOIN.

Non è possibile utilizzare diversi SCHEMA all'interno di un singolo database per memorizzare tutti i dati?

+0

Non posso, Abbiamo alcuni database pieni di dati e nessuno vuole cambiare nulla:/Se userò questo dblink, posso fare qualcosa del genere: INSERISCI IN DB1.table SELECT * FROM DB2.table; – sennin

+7

Si può certamente farlo se si esegue la query in db1, sth come 'INSERT INTO db1_table (cols ...) SELECT cols ... FROM dblink ('db2', 'SELECT cols ... FROM db2_table')' – araqnid

+1

Ho usato questo 'dblink()' per connetterlo funziona sempre per me – Manwal

4

è necessario utilizzare dblink ... come araqnid accennato in precedenza, qualcosa di simile a questo funziona bene:

selezionare ST.Table_Name, ST.Column_Name, DV.Table_Name, DV.Column_Name, * da information_schema.Colonne ST full outer join dblink ('dbname = otherdatabase', 'selezionare table_name, column_name da INFORMATION_SCHEMA.COLUMNS') DV (table_name testo, COLUMN_NAME testo) su ST.Table_Name = DV.Table_name e ST.Column_Name = DV.Column_Name dove ST.Column_Name è nullo o DV.Column_Name è NULL

4

Sì, è possibile farlo utilizzando dblink anche se con considerazioni di prestazioni significative.

L'esempio seguente richiede che l'utente SQL corrente disponga delle autorizzazioni su entrambi i database. Se db2 non si trova nello stesso cluster, sarà necessario sostituire dbname=db2 con la stringa di connessione completa definita nello dblink documentation.

SELECT * 
FROM table1 tb1 
LEFT JOIN (
    SELECT * 
    FROM dblink('dbname=db2','SELECT id, code FROM table2') 
    AS  tb2(id int, code text); 
) AS tb2 ON tb2.column = tb1.column; 

Se table2 è molto grande, si potrebbe avere problemi di prestazioni, perché il sub-query di carichi fino l'intero table2 prima di effettuare il join.

2

Hai usato estensione dblink di postgresql.

Reference take from this Article:

dbLink estensione di PostgreSQL che viene utilizzato per collegare un database a un altro database.

Installa l'estensione DbLink.

CREATE EXTENSION dblink; 

Verifica dbLink:

SELECT pg_namespace.nspname, pg_proc.proname 
FROM pg_proc, pg_namespace 
WHERE pg_proc.pronamespace=pg_namespace.oid 
    AND pg_proc.proname LIKE '%dblink%'; 

ho già preparato piena dimostrazione su questo. Si prega di visitare il mio post per imparare passo dopo passo l'esecuzione di query su database cross in Postgresql.

+0

Buona cattura. Non tutti sanno che è necessario che l'estensione sia attiva. – Stradas

+0

Grazie Stradas! – Anvesh

10

Dimentica di dblink!

dire ciao Postgres_FDW:

Per preparare l'accesso remoto utilizzando postgres_fdw:

  1. installare l'estensione postgres_fdw utilizzando CREATE EXTENSION.

  2. Creare un oggetto server esterno, utilizzando CREATE SERVER, per rappresentare ciascun database remoto a cui si desidera connettersi. Specificare le informazioni sulla connessione , ad eccezione di utente e password, come opzioni dell'oggetto server .

  3. Creare un mapping utente, utilizzando CREATE USER MAPPING, per ciascun utente di database a cui si desidera consentire l'accesso a ciascun server esterno. Specificare il nome utente remoto e la password da utilizzare come opzioni utente e password del mapping utente.

  4. Creare una tabella esterna, utilizzando CREATE FOREIGN TABLE o IMPORT FOREIGN SCHEMA, per ogni tabella remota a cui si desidera accedere. Le colonne della tabella esterna devono corrispondere alla tabella remota di riferimento.È tuttavia possibile, , utilizzare nomi di tabelle e/o colonne diversi da quelli della tabella remota , se si specificano i nomi remoti corretti come opzioni dell'oggetto tabella esterna .

Ora è necessario solo SELECT da una tabella straniero per accedere ai dati memorizzati nella sua tabella remota sottostante.

È davvero utile anche su dati di grandi dimensioni.