2011-07-16 15 views
5

任何人都可以提供一個例子(涉及各種SQL語句)如何在postgresql中使用外部數據包裝器來啓用來自postgresql數據庫A的表來加入到postgresql數據庫B的表中?如何使用PostgreSQL外部數據包裝器加入2個不同的PostgreSQL數據庫

從文檔中不清楚pgsql 9.0與9.1中可用的FDW功能的程度。該文檔也沒有任何示例顯示如何使用FDW在2個不同的postgresql數據庫(使用WHERE限定符下推)之間進行連接。

http://www.postgresql.org/docs/9.0/static/sql-createforeigndatawrapper.html

http://www.postgresql.org/docs/9.1/static/ddl-foreign-data.html

http://www.depesz.com/index.php/2011/03/14/waiting-for-9-1-foreign-data-wrapper/

回答

6

你操縱它就像任何表。每Depesz」後:

CREATE FOREIGN TABLE passwd (
    username text, 
    pass text, 
    uid int4, 
    gid int4, 
    gecos text, 
    home text, 
    shell text 
) SERVER file_server 
OPTIONS (format 'text', filename '/etc/passwd', delimiter ':', null ''); 

select * from passwd; 

的文檔都沒有一個很好的理由連接表的例子:它是普通的老SQL ...

的加入下推目前是GSOC的主題:

+1

你提供的例子是'file_server'。你可以編輯示例以連接到外部postgresql服務器嗎?謝謝。 – archmeta

+0

然後它將成爲與不同服務器相同的語法。請參閱相關文檔:http://www.postgresql.org/docs/current/static/sql-createserver.html/CREATE SERVER myserver FOREIGN DATA WRAPPER pgsql OPTIONS(host'foo',dbname'foodb',port' 5432');' –

+0

我在我的9.1上得到錯誤「ERROR:foreign-data wrapper」pgsql「does not exist」 - 任何想法我失蹤了?謝謝 – alfonx

3

我找到的最簡單的解決方案是dblink擴展。我測試了PostgreSQL的9.1:

create extension dblink. 
select * from dblink('port=5452 host=localhost dbname=mydb user=myuser password=xxx', 
        'select id,spaltenname from variablen') as v (a int, b varchar(20)); 

http://www.postgresql.org/docs/9.1/static/dblink.html

一個簡單的連接就可以:

with a as (select * from dblink('port=5452 host=localhost dbname=mydb user=myuser password=xxx', 'select id,spaltenname from variablen') as v (a int, b varchar(20))) 
select a join (select 1)b on (true); 

上面的例子,您可以與其他的PostgreSQL服務器上的表加入,但它是隻是一個副本,然後加入。按照您的稱呼,不會自動顯示「WHERE qualifier push-down」。你當然可以只選擇你需要他們的第一個語句行...

1

如果你想加入2個不同的PostgreSQL數據庫,我建議你使用DBLINK:

select datos.* 
    FROM dblink('hostaddr=192.168.0.10 port=5432 dbname=my_dbname user=my_user password=my_pass'::text, ' 
       select field_1, field_2 
       from my_table order by field_1 
       ' 
       ::text) 
     datos(field_1, integer, field_2 character varying(10)); 

(我測試了它在PostgreSQL 9.1.3上) http://www.postgresql.org/docs/9.2/static/contrib-dblink-function.html

相關問題