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

sen*_*nin 54 postgresql join

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

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

ndt*_*viv 55

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

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

编辑:3年后(2014年3月),此FAQ条目已经过修订,更有帮助:

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

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

PostgreSQL中的SQL/MED支持允许创建"外部数据包装器",将远程数据库中的表链接到本地​​数据库.远程数据库可能是同一个PostgreSQL实例上的另一个数据库,也可能是世界各地的数据库,没关系.postgres_fdw内置于PostgreSQL 9.3并包含读/写支持; 9.2的只读版本可以作为contrib模块进行编译和安装.

contrib/dblink允许使用函数调用进行跨数据库查询,并且可用于更旧的PostgreSQL版本.与postgres_fdw不同,它不能"压低"条件到远程服务器,因此它通常会获取比您需要的更多数据.

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


Lui*_*Vaz 30

忘了dblink!

Postgres_FDW问好:

使用postgres_fdw以下方法准备远程访问:

  1. 使用安装postgres_fdw扩展CREATE EXTENSION.

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

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

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

现在,您只需SELECT要从外表访问存储在其基础远程表中的数据.

它甚至对大数据也很有用.


Ell*_* B. 7

是的,dblink尽管有很多性能方面的考虑,也可以使用此方法。

下面的示例将要求当前的SQL用户对两个数据库都具有权限。如果db2不在同一集群上,那么您将需要替换dbname=db2dblink文档中定义的完整连接字符串。

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;
Run Code Online (Sandbox Code Playgroud)

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

  • 对我不起作用。我收到``查询 1 错误:错误:“;”处或附近的语法错误```` (2认同)

Fra*_*ens 6

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

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

  • 如果你在db1中执行查询,你当然可以这样做,例如`INSERT INTO db1_table(cols ...)SELECT cols ... FROM dblink('db2','SELECT cols ... FROM db2_table')` (7认同)

Ips*_*yay 5

只需几步,您就可以达到目标: 按照这个参考一步一步来

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]
Run Code Online (Sandbox Code Playgroud)