Oracle 批量修改資料 Merge 使用小結

2021-08-13 20:50:21 字數 2085 閱讀 3635

在近期的需求中遇到了匹配兩表的關聯字段,修改主表的字段業務。由於是批量修改接觸到了oracle的merge

遇到新的知識,本人首先去了解了一下

merge語句是sql語句的一種。在sql server、oracle資料庫中可用,mysql、postgresql中不可用。merge是oracle9i新增的語法,用來合併update和insert語句。通過merge語句,根據一張表(原資料表,source table)或子查詢的連線條件對另外一張(目標表,target table)表進行查詢,連線條件匹配上的進行update,無法匹配的執行insert。這個語法僅需要一次全表掃瞄就完成了全部工作,執行效率要高於insert+update。

具體來說,merge語句會檢查原資料表記錄和目標表記錄。如果記錄在原資料表和目標表中均存在,則目標表中的記錄將被原資料表中的記錄所更新(執行update操作);如果目標表中不存在的某(些)記錄,在原資料表中存在,則原資料表的這(些)記錄將被插入到目標表中(執行insert操作)。

在oracle 10g之前,merge語句支援匹配更新和不匹配插入兩種簡單的用法,在10g中oracle對merge語句做了增強,增加了條件選項where和delete操作.

merge [hint] into [schema ] table [t_alias]

using [schema ] [t_alias]

on ( condition )

when matched then merge_update_clause

when not matched then merge_insert_clause;

使用詳情:

merge

into

second s

using (select * from trade) t

on (s.settle_serial=t.settle_serial)

when

matched

then

update

sets.remarks = t.serial

where to_char(add_time,'yyyy-mm-dd')=to_char(sysdate,'yyyy-mm-dd')

--其中

second 為目標表,也就是執行merge

into 需要修改的表,s為別名 --t也是別名

using 為目標表提供資料來源(tip:其提供的資料來源可以為 單個表[trade],也可以為乙個sql[select * from trade])

on 表示兩張表的關聯條件

when

matched

then 表示符合 on 關聯條件的資料 進行操作

update

set 修改操作

update的資料必須為目標表的資料,

where 滿足修改的語句(tip:lz這裡是當天時間,格式化當天時間,與資料庫add_time匹配)

如果在進行萬批量修改操作後,有業務需求要求向目標表寫入不匹配資料就會用到下面的merge 語句

when

not matched then insert values (s.id, s.owner, s.object_name,s.remarks);

--其中

when

not matched then 表示為不匹配on中的關聯條件的資料進行下面的操作

新增到s目標表的資料,為資源表的資料。

如上為本人親測使用,批量修改還可以使用update-select 進行批量修改。

現在的merge應該可以完全代替update了。。。

因為oracle update的限制,關聯update寫法類似update set =(….寫一遍) where exists (寫一篇),而且對錶或索引的訪問光寫法就2次,而且對於set裡的子查詢類似nested loops…執行次數可能更多了,更新的行數多必然慢。

但是merge就沒有上面的缺點了,可以走hash join,更新行數多,優勢就出來了。。。

Oracle 批量修改資料 Merge

merge語句是sql語句的一種。在sql server oracle資料庫中可用,mysql postgresql中不可用。merge是oracle9i新增的語法,用來合併update和insert語句。通過merge語句,根據一張表 原資料表,source table 或子查詢的連線條件對另外一...

游標 批量修改資料

批量修改表中資料 declare my cursor cursor 定義游標 for select from table where id 查出需要的集合放到游標中 open my cursor 開啟游標 fetch next from my cursor 讀取第一行資料 while fetch s...

SQL批量修改資料

1 批量替換 期中的年份 以替換為2019年為例 update 資料表名 set 期時間字段 stuff convert nvarchar 23 期時間字段,120 1,4,2019 2 批量替換 期中的 份 以替換為6 為例 update 資料表名 set 期時間字段 stuff convert ...