資料庫示例如下 :name是關鍵欄位

資料庫A 表 t1name value

a 1

b 2資料庫B 表 t1name value

a 3

c 4

現在想把資料庫B的表t1合併到資料庫A的表t1中,如果 name欄位相同則把value值相加後保存,否則就將記錄直接插入到資料庫A中,比如上面的示例,操作完成後應該如下

name valuea 4

b 2

c 4

sql語句應該如何寫。。。。求高手幫助給出完整寫法,非常感謝!


刪掉一個


# 創建資料庫
create database db_a;
create database db_b;
# 創建表
create table db_a.t1
(
name varchar(255) null,
value varchar(255) null
);
create table db_b.t1
(
name varchar(255) null,
value varchar(255) null
);
# 插入數據
insert into db_a.t1 values("a","1"),("b","2");
insert into db_b.t1 values("a","3"),("c","4");
# 根據你的需求查詢數據
# 首先把兩個庫的t1表查出來,然後通過union all拼成一張新的表
# 然後直接按name做group, 把value值加一起就好了
select name,sum(value) from (select * from db_a.t1 union all select * from db_b.t1) as t group by name;

查出來數據以後,插入新的臨時表,把原來的db_a.t1表改名,把臨時把改成t1就好了


這個不算複雜需求吧,我知道oracle至少有兩個方案,1,使用merger語句,2,使用存儲過程


方法有很多

  1. 將資料庫A中的表t1教小,則將t1導出成csv文件,然後導入資料庫B中;如果t2較小則導出t2

2. 大數據資料庫都提供database federation的組件,例如postgresql的fdw等,可以直接在兩個庫之間進行查詢

3. 使用ETL工具


異構資料庫的join或merge操作,可以使用etl工具或者其思想來實現。

所謂ETL,E抽取(Extract,同源或者不同源數據),T轉換(Transform,數據流特定業務邏輯處理),T載入(Load,做好數據流合併,數據流轉換後,寫入目標庫)

具體的工具或者說引擎,離線或者準實時清洗如:datastage,kettle,informatic等,實時數據流join如:flink、spark等

上面的思想都是異構數據源直接合併數據流的思想。

也可以,先把異構數據源,抽取到同構數據源,再做內部sql join也是一種思路。


使用attach然後讀表1插入到表2


推薦閱讀:
相關文章