当前位置: 首页 > news >正文

PostgreSQL 跨库查询方法

问题描述:

PostgreSQL 跨库查询方法

select rc.tm,fq,fq_old,sccd,unitcd from resource_calc_scene_section_result as rc
inner join "mxpt_yushuiqingsrc_databases"."public".st_river_r_hi as st on st.stcd= rc.bscd and st.tm = rc.tmwhere scprod_id in ('13524' ) order  by bscd,rc.tm;

postgresql数据库,如何实现跨库联查呢?


解决方案:

在 PostgreSQL 中实现跨库联查有几种方法,因为 PostgreSQL 本身不支持直接的跨库查询(不像 MySQL 的 database.table 语法)。以下是几种解决方案:

1. 使用 dblink 扩展

这是最常用的方法,需要先安装 dblink 扩展:

-- 首先安装扩展
CREATE EXTENSION IF NOT EXISTS dblink;-- 然后使用 dblink 进行跨库查询
SELECT rc.tm, rc.fq, rc.fq_old, rc.sccd, rc.unitcd 
FROM resource_calc_scene_section_result AS rc
INNER JOIN dblink('dbname=mxpt_yushuiqingsrc_databases', 'SELECT stcd, tm FROM public.st_river_r_hi') AS st(stcd text, tm timestamp) ON st.stcd = rc.bscd AND st.tm = rc.tm
WHERE rc.scprod_id IN ('13524')
ORDER BY rc.bscd, rc.tm;

2. 使用 FDW (Foreign Data Wrapper)

这是更现代的解决方案,可以创建外部表:
-- 安装 postgres_fdw 扩展
CREATE EXTENSION IF NOT EXISTS postgres_fdw;-- 创建服务器连接
CREATE SERVER foreign_server
FOREIGN DATA WRAPPER postgres_fdw
OPTIONS (host 'localhost', dbname 'mxpt_yushuiqingsrc_databases');-- 创建用户映射
CREATE USER MAPPING FOR current_user
SERVER foreign_server
OPTIONS (user 'username', password 'password');-- 创建外部表
CREATE FOREIGN TABLE foreign_st_river_r_hi (stcd text,tm timestamp-- 其他字段...
)
SERVER foreign_server
OPTIONS (schema_name 'public', table_name 'st_river_r_hi');-- 然后就可以像普通表一样查询
SELECT rc.tm, rc.fq, rc.fq_old, rc.sccd, rc.unitcd 
FROM resource_calc_scene_section_result AS rc
INNER JOIN foreign_st_river_r_hi AS st ON st.stcd = rc.bscd AND st.tm = rc.tm
WHERE rc.scprod_id IN ('13524')
ORDER BY rc.bscd, rc.tm;

3. 使用临时表或物化视图

如果不能使用上述方法,可以先将外部数据库的数据导入到当前数据库:

-- 创建临时表
CREATE TEMP TABLE temp_st_river_r_hi AS
SELECT * FROM dblink('dbname=mxpt_yushuiqensrc_databases', 'SELECT * FROM public.st_river_r_hi') AS t(stcd text, tm timestamp);-- 然后查询
SELECT rc.tm, rc.fq, rc.fq_old, rc.sccd, rc.unitcd 
FROM resource_calc_scene_section_result AS rc
INNER JOIN temp_st_river_r_hi AS st ON st.stcd = rc.bscd AND st.tm = rc.tm
WHERE rc.scprod_id IN ('13524')
ORDER BY rc.bscd, rc.tm;

注意事项
确保有足够的权限访问两个数据库

跨库查询可能影响性能,特别是大数据量时

考虑网络延迟(如果数据库在不同的服务器上)

FDW 方法需要 PostgreSQL 9.3 或更高版本

对于您的具体查询,我建议使用 dblink 或 FDW 方法,因为它们更灵活且不需要数据复制。

改写后的sql语句:

SELECT  rc.bscd, rc.tm, rc.fq, rc.fq_old, rc.sccd, rc.unitcd, st.tm, st.q
FROM resource_calc_scene_section_result AS rc
INNER JOIN dblink('host=180.451.242.185 port=30002 dbname=postgres user=yw5pt password=pgread@HL202555', 'SELECT stcd, tm, q FROM md.st_river_r_hi where tm >= ''2025-07-20 08:00:00'' and tm <= ''2025-07-20 08:00:00''') AS st(stcd text, tm timestamp, q numeric) ON st.stcd = rc.bscd AND st.tm = rc.tm
WHERE rc.scprod_id IN ('13524')
ORDER BY rc.bscd, rc.tm;
http://www.dtcms.com/a/295266.html

相关文章:

  • Apache Flink 实时流处理性能优化实践指南
  • uniapp写app做测试手机通知栏展示内容
  • uni-appDay02
  • 从零用java实现 小红书 springboot vue uniapp(14) 集成阿里云短信验证码
  • 复盘—MySQL触发器实现监听数据表值的变化,对其他数据表做更新
  • 图片查重从设计到实现(2)Milvus安装准备etcd介绍、应用场景及Docker安装配置
  • 算法竞赛阶段二-数据结构(34)数据结构链表STL vector
  • 数据结构-4(常用排序算法、二分查找)
  • ​​GOFLY LIVE CHAT:Golang製オープンソース・ライブチャットシステム​
  • PHP文件下载
  • 嵌入式学习-(李宏毅)机器学习(2)-day29
  • 天线增益方向图是怎么绘制的?
  • 【ROS1】09-ROS通信机制——参数服务器
  • JavaSE:学习输入输出编写简单的程序
  • 从java到vue3:第二天
  • 字符串和对象的深拷贝和浅拷贝
  • 教务管理系统学员管理系统模块设计
  • Ubuntu-安装Epics教程
  • 从零构建 Node20+pnpm+pm2 环境镜像:基于 Dockerfile 的两种方案及持久化配置指南
  • NPM/Yarn完全指南:前端开发的“基石“与“加速器“
  • 用LangChain重构客服系统:腾讯云向量数据库+GPT-4o实战
  • AI风险治理“实战”落地:CISO如何将GenAI纳入GRC管控体系
  • 前端面试专栏-前沿技术:30.跨端开发技术(React Native、Flutter)
  • 从零构建:Jenkins与Kubernetes集成的完整指南
  • 借助 VR 消防技术开展应急演练,检验完善应急预案​
  • 血液样本的分类与应用
  • 论文阅读--《Besting the Black-Box: Barrier Zones for Adversarial Example Defense》
  • Elasticsearch 高级查询语法 Query DSL 实战指南
  • 2025年“创新杯”(原钉钉杯) A题 建模思路
  • Java 实现 C/S 架构详解:从基础到实战,彻底掌握客户端/服务端编程