是否可以从两个独立的postgres数据库中JOIN
行?
我正在使用一个服务器中的几个数据库的系统,有时我真的需要这样的功能。
答案 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
准备远程访问:
使用
postgres_fdw
安装CREATE EXTENSION
扩展程序。使用
CREATE SERVER
创建外部服务器对象,以表示要连接的每个远程数据库。指定连接 除用户和密码之外的信息,作为服务器的选项 对象使用
CREATE USER MAPPING
为要允许访问每个外部服务器的每个数据库用户创建用户映射。指定 用作用户和密码选项的远程用户名和密码 用户映射。- 醇>
使用
CREATE FOREIGN TABLE
或IMPORT FOREIGN SCHEMA
为要访问的每个远程表创建一个外表。列 外表的必须与引用的远程表匹配。您可以, 但是,使用与远程不同的表和/或列名称 table,如果指定了正确的远程名称作为选项 外表对象。现在,您只需要外表中的
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]