当前位置: 首页 > 科技观察

在PostgreSQL中使用dblink实现跨库查询的方法_0

时间:2023-03-19 23:05:50 科技观察

本文主要介绍在PostgreSQL中使用dblink实现跨库查询的方法。需要的朋友可以参考一下。最近一条sql语句涉及到跨数据库表之间的联合查询,所以研究一下。一开始学的是写sql语句,但是执行失败。我需要先安装dblink扩展。这些博文并没有说清楚。感谢网友指点,只需要在Windows下对应的数据库中执行SQL语句“createextensiondblink”就可以了。上面几篇博文基本都是讲linux下的操作方法,所以绕了个弯。2、下载了PostgreSQL的源码,但是不知道在哪里执行语句。好像是在linux下的shell里执行的,但是我在psql和cmd里都试过了,都是走弯路。我也试过直接复制dblink.sql中的语句运行,但是失败了,报错。3、Windows下很简单,一句sql就可以得到“createextensiondblink”。在extension中可以看到多了一个dblink:函数中dblink开头有对应的函数:这条sql语句好像只是调用运行创建了dblink.control文件:3.写一条sql语句到测试是否可以。跨库查询,查询前必须先建立数据库连接,否则会报错。图中显示名为“unnamed”的连接,因为还有其他连接,如果没有连接,会提示connectionnotavailable:usedblink(text,text),第一个参数是连接字符串,第二个参数是一条sql语句。执行成功:或者先使用dblink_connect(text)建立连接,再使用dblink(text)进行跨库查询:检查连接:selectdblink_get_connections()断开所有连接:selectdblink_disconnect()断开指定名称的连接:selectdblink_disconnect('test')如果之前建立了名为'test'的连接:selectdblink_connect('test','host=localhostdbname=cbe_stauser=postgrespassword=lifc126820');会提示断开连接成功。4.***,我需要的sql语句也可以,同一台服务器上的两库三表联合查询,先建立连接再做查询:selectdblink_connect('host=localhostdbname=cbe_userdatauser=postgrespassword=lifc126820');selectA.id,A.codeaspoicode,A.cname,A.geo,A.x,A.y,A.s01,A.s02,A.s03,A.updatetime,A.tbcode,D.code,D.data,D.value,D.cnameascolname,D.ifdata,D.sortfromtb_test_poiAinnerjoin((select*fromdblink('selectpoicode,code,data,valuefromtb_test_data_poi')asT1(poicodecharactervarying(50),codecharactervarying(50),datadoubleprecision,valuecharactervarying(500))))Binnerjoin(select*fromdblink('selectcname,codeascode1,ifdata,sortfromtb_test_index_poi')asT2(cnamecharactervarying(200),code1charactervarying(50),ifdatacharactervarying(5),sortcharactervarying(50)))ConB.code=C.code1)DonA.code=D.poicode;如果做成视图,这里需要使用dblink(text,text)。如果直接使用上面的sql语句,会报错说无法建立连接:CREATEORREPLACEVIEWvw_test_poiASSELECTa.id,a.codeASpoicode,a。cname,a.geo,a.x,a.y,a.s01,a.s02,a.s03,a.updatetime,a.tbcode,d.code,d.data,d.value,d.cname,AScolname,d.ifdata,d.sortFROMtb_test_poiaJOIN((SELECTt1.poicode,t1.code,t1.data,t1.valueFROMdblink('host=localhostdbname=cbe_userdatauser=postgrespassword=lifc126820'::text,'selectpoicode,code,data,valuefromtb_test_data_poi'::text)t1(poicodecharacter变化(50),代码字符变化(50),数据双精度,值字符变化(500)))bJOIN(SELECTt2.cname,t2.code1,t2.ifdata,t2.sortFROMdblink('host=localhostdbname=cbe_userdatauser=postgrespassword=lifc126820'::text,'selectcname,codeascode1,ifdata,sortfromtb_test_index_poi'::text)t2(cnamecharactervarying(200),code1charactervarying(50),ifdatacharactervarying(5),sortcharactervarying(50)))cONb.code::text=c.code1::text)dONa.code::text=d.poicode::text我发现执行效率有点慢。检测数据10000多条,耗时2秒多。目前我的程序中并没有使用dblink,因为输入的参数可以单独在一张表中查询,然后其他两张表的信息关联查询就ok了,所以我分两步来解决这个问题.具体效率没有深入比较。如果后期需要调整,可以考虑使用dblink来做。毕竟程序中的代码会简单很多。