問題描述:
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;