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;
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]
您需要使用dblink...正如上面提到的araqnid,这样的操作很好: 在ST.Table_name=DV.Table_name和ST.Column_name=DV.Column_name上选择ST.Table_name、ST.Column_name、DV.Column_name、*from INFORMATION_SCHEMA。Columns ST FULL OUTER JOIN DBLINK(‘DBNAME=ther DATABASE’,‘SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA’)DV(表名文本、列名文本)。
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%';
8条答案
按热度按时间des4xlb01#
根据http://wiki.postgresql.org/wiki/FAQ的说法
除了当前数据库之外,没有其他方法可以查询其他数据库。由于PostgreSQL加载特定于数据库的系统目录,因此不确定跨数据库查询的行为。Conrib/dblink允许使用函数调用进行跨数据库查询。当然,客户端也可以同时连接到不同的数据库,并在客户端合并结果。
编辑:3年后(2014年3月),此FAQ条目已修改,更有帮助:
如何使用多个数据库查询?
除了当前数据库之外,无法直接查询其他数据库。由于PostgreSQL加载特定于数据库的系统目录,因此不确定跨数据库查询的行为。
PostgreSQL中的SQL/MED支持允许创建“外来数据 Package 器”,将远程数据库中的表链接到本地数据库。远程数据库可能是同一个PostgreSQL示例上的另一个数据库,也可能是地球另一边的数据库,这都无关紧要。Postgres_fdw内置在PostgreSQL 9.3中,并包括读/写支持;9.2的只读版本可以编译和安装为Conrib模块。
Conrib/dblink允许使用函数调用进行跨数据库查询,并且可用于更旧的PostgreSQL版本。与postgres_fdw不同,它不能将条件“下推”到远程服务器,因此它通常会获取比您需要的多得多的数据。
当然,客户端也可以同时连接到不同的数据库,并在客户端合并结果。
gtlvzcf82#
忘掉眨眼吧!
向Postgres_FDW问好:
要使用
postgres_fdw
准备远程访问,请执行以下操作:1.使用
CREATE EXTENSION
安装postgres_fdw
扩展。1.使用
CREATE SERVER
创建一个外部服务器对象,以表示您要连接到的每个远程数据库。指定连接信息(用户和密码除外)作为服务器对象的选项。1.使用
CREATE USER MAPPING
为您希望允许访问每个外部服务器的每个数据库用户创建一个用户Map。指定要用作用户Map的用户和密码选项的远程用户名和密码。1.使用
CREATE FOREIGN TABLE
或IMPORT FOREIGN SCHEMA
为每个要访问的远程表创建一个外表。外表的列必须与引用的远程表匹配。但是,如果您将正确的远程表名称指定为外部表对象的选项,则可以使用不同于远程表的表名和/或列名。现在,您只需要来自外部表的
SELECT
就可以访问存储在其底层远程表中的数据。即使是在大数据上,它也非常有用。
aelbi1ox3#
是的,使用
dblink
可以做到这一点,尽管需要考虑大量的性能因素。以下示例将要求当前SQL用户对这两个数据库都具有权限。如果
db2
不在同一群集中,则需要将dbname=db2
替换为dblink documentation中定义的完整连接字符串。如果
table2
非常大,则可能会出现性能问题,因为子查询在执行联接之前加载了整个table2
。cwxwcias4#
不,您不能。您可以使用dblink从一个数据库连接到另一个数据库,但如果您正在寻找联接,这将没有帮助。
您不能在一个数据库中使用不同的模式来存储所有数据吗?
njthzxwz5#
只需几步,你就能达到目标:follow this reference step by step
zpqajqem6#
您需要使用dblink...正如上面提到的araqnid,这样的操作很好:
在ST.Table_name=DV.Table_name和ST.Column_name=DV.Column_name上选择ST.Table_name、ST.Column_name、DV.Column_name、*from INFORMATION_SCHEMA。Columns ST FULL OUTER JOIN DBLINK(‘DBNAME=ther DATABASE’,‘SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA’)DV(表名文本、列名文本)。
wr98u20j7#
您已经使用了PostgreSQL dblink扩展。
Reference take from this Article:
PostgreSQL的DBLink扩展,用于将一个数据库连接到另一个数据库。
安装DbLink扩展。
验证DbLink:
我已经为这一点准备了充分的演示。请访问我的帖子,了解如何在PostgreSQL中执行跨数据库查询。
mm9b1k5b8#
不能做吗?我们当然可以,如果没有特别的扩展。在我们的例子中,我们必须比较来自不同数据库服务器的两个表,例如ACC和PROD,因此比大多数答案更难。特别是因为ACC和PROD故意在不同的服务器上制造障碍,所以您不会轻易获得足够的权限来在外部服务器上执行GRANT USAGE。
显而易见的解决方案是导出两个表,然后将两个表导出到同一个数据库中,例如DEV或您自己的本地数据库中,并使用适当的名称(例如Table1_acc和Table1_prod)或模式(如acc和prod)。然后,你可以加入那些没有特殊问题的人。