加入两个独立数据库的结果

时间:2011-01-13 10:12:39

标签: postgresql join

是否可以从两个独立的postgres数据库中JOIN行?

我正在使用一个服务器中的几个数据库的系统,有时我真的需要这样的功能。

7 个答案:

答案 0 :(得分:53)

根据http://wiki.postgresql.org/wiki/FAQ

  

无法查询当前数据库以外的数据库。   因为PostgreSQL加载了特定于数据库的系统目录,所以它是   不确定跨数据库查询应该如何表现。   contrib / dblink允许使用函数调用进行跨数据库查询。的   当然,客户也可以同时连接到不同的   数据库并在客户端合并结果。

编辑:3年后(2014年3月),此常见问题解答条目已经过修订,更有帮助:

  

如何使用多个数据库执行查询?

     

无法直接查询当前数据库以外的数据库   一。因为PostgreSQL加载了特定于数据库的系统目录,所以它是   不确定跨数据库查询应该如何表现。

     

PostgreSQL中的SQL / MED支持允许“外部数据包装器”   创建,将远程数据库中的表链接到本地​​数据库。   远程数据库可能是同一PostgreSQL上的另一个数据库   例如,或者世界各地的数据库,没关系。   postgres_fdw内置于PostgreSQL 9.3并包含读/写   支持;可以编译和安装9.2的只读版本   贡献模块。

     

contrib / dblink允许使用函数调用和跨数据库查询   适用于较旧的PostgreSQL版本。与postgres_fdw不同   它不能“推下”条件到远程服务器,所以它经常   最多可以获取比你需要的数据更多的数据。

     

当然,客户端也可以同时进行连接   不同的数据库并在客户端合并结果。

答案 1 :(得分:26)

忘了dblink!

Postgres_FDW打个招呼:

  

使用postgres_fdw准备远程访问:

     
      
  1. 使用postgres_fdw安装CREATE EXTENSION扩展程序。

  2.   
  3. 使用CREATE SERVER创建外部服务器对象,以表示要连接的每个远程数据库。指定连接   除用户和密码之外的信息,作为服务器的选项   对象

  4.   
  5. 使用CREATE USER MAPPING为要允许访问每个外部服务器的每个数据库用户创建用户映射。指定   用作用户和密码选项的远程用户名和密码   用户映射。

  6.   
  7. 使用CREATE FOREIGN TABLEIMPORT FOREIGN SCHEMA为要访问的每个远程表创建一个外表。列   外表的必须与引用的远程表匹配。您可以,   但是,使用与远程不同的表和/或列名称   table,如果指定了正确的远程名称作为选项   外表对象。

  8.         

    现在,您只需要外表中的SELECT来访问数据   存储在其底层远程表中。

即使对大数据也很有用。

答案 2 :(得分:6)

不,你不能。您可以使用dblink从一个数据库连接到另一个数据库,但如果您正在寻找JOIN,那将无济于事。

您不能在单个数据库中使用不同的SCHEMA来存储所有数据吗?

答案 3 :(得分:6)

是的,可以使用dblink执行此操作,但需要考虑重要因素。

以下示例将要求当前SQL用户拥有两个数据库的权限。如果db2不在同一群集上,则您需要将dbname=db2替换为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;

如果table2非常大,则可能会遇到性能问题,因为子查询会在执行连接之前加载整个table2

答案 4 :(得分:4)

你需要使用dblink ...作为上面提到的araqnid,这样的工作正常:

  

选择ST.Table_Name,ST.Column_Name,DV.Table_Name,DV.Column_Name,*   来自information_schema.Columns ST   完全外连接dblink(' dbname = otherdatabase','选择Table_Name,   来自information_schema.Columns的Column_Name')DV(Table_Name文本,   Column_Name文本)   在ST.Table_Name = DV.Table_name上   和ST.Column_Name = DV.Column_Name   其中ST.Column_Name为null或DV.Column_Name为NULL

答案 5 :(得分:2)

您使用了postgresql的dblink扩展名。

Reference take from this Article:

PostgreSQL的DbLink扩展,用于将一个数据库连接到另一个数据库。

安装DbLink扩展程序。

CREATE EXTENSION dblink;

验证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%';

我已经准备好了充分的演示。请访问我的帖子,逐步学习在Postgresql中执行跨数据库查询。

答案 6 :(得分:2)

只需几步即可达到目标: follow this reference step by step

WE HAVE BEEN CONNECTED TO DB2 WITH TABLE TBL2 AND COLUMN COL2
ALSO THERE IS DB1 WITH TBL1 AND COLUMN COL1

 *** connecting to second db ie db2
    Now just **copy paste the 1-7 processes** (make sure u use correct username and password and ofcourse db name)

    1.**CREATE EXTENSION dblink;**

    2.**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%';**

    3.**SELECT dblink_connect('host=localhost user=postgres password=postgres dbname=db1');**

    4.**CREATE FOREIGN DATA WRAPPER postgres VALIDATOR postgresql_fdw_validator;**

    5.**CREATE SERVER postgres2 FOREIGN DATA WRAPPER postgres OPTIONS (hostaddr '127.0.0.1', dbname 'db1');**

    6.**CREATE USER MAPPING FOR postgres SERVER postgres2 OPTIONS (user 'postgres', password 'postgres');**

    7.**SELECT dblink_connect('postgres2');**

    ---Now, you can SELECT the data of Database_One from Database_Two and even join both db results:

    **SELECT * FROM public.dblink
    ('postgres2','SELECT col1,um_name FROM public.tbl1 ') 
    AS DATA(um_userid INTEGER),tbl2 where DATA.col1=tbl2.col2;**


You can also Check this :[How to join two tables of different databases together in postgresql [\[working finely in version 9.4\]][1]