001-Merge into 用法

Merge into 用法

使用 MERGE 語句從一個或多個源中選擇行,以便更新或插入表或視圖。您可以指定條件來決定是否更新或插入目標表或視圖。

此語句是組合多個操作的方便方法。它允許您避免多次插入、更新和刪除DML語句。

MERGE 是一個確定性語句。不能在同一 MERGE 語句中多次更新目標表的同一行。

注意
Oracle 數據庫在合併語句期間不實現細粒度訪問控制。如果在目標表或多個表上使用細粒度訪問控制特性,則使用等效的 INSERT 和 UPDATE 語句,而不是 MERGE,以避免錯誤消息,並確保正確的訪問控制。

1、語法

MERGE INTO table_name alias1
USING (table | view | sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
  DDL OR DML 語句
WHEN NOT MATCHED THEN
  INSERT (col_list) VALUES (col_values);

using
使用USING子句指定要更新或插入的數據的源。源可以是表、視圖或子查詢的結果。

on
使用ON子句指定合併操作更新或插入的條件。對於搜索條件爲真的目標表中的每一行,Oracle數據庫都會用源表中的相應數據更新該行。如果條件對任何行都不爲真,則數據庫將基於對應的源錶行插入目標表。

delete where
delete where 子句是在填充或更新表時清理表中的數據。刪除數據必須包含在 on 子句定義的連接中,否則不會刪除數據。

  • delete where 需要跟在填充或更新表操作的後面。
  • 刪除的數據必須包含在 on 子句定義的連接中。

2、示例

原表數據:
在這裏插入圖片描述

2.1 實現一次更新操作

merge into emp a 
using (select 4 as empno from dual) b
on (a.empno = b.empno)
when matched then
	update set a.ename = 'kitty'
when not matched then
	insert (empno,ename) values(4,'hahahaha');

再次查詢表結果:
在這裏插入圖片描述

2.2 實現一次插入操作

merge into emp a 
using (select 5 as empno from dual) b
on (a.empno = b.empno)
when matched then
	update set a.ename = 'aaaaaa'
when not matched then
	insert (empno,ename) values(5,'hahahaha');

再次查詢表結果:
在這裏插入圖片描述

2.3 更新、刪除操作同時完成

delete where 子句是在填充或更新表時清理表中的數據。刪除數據必須包含在 on 子句定義的連接中,否則不會刪除數據。

  • delete where 需要跟在填充或更新表操作的後面。
  • 刪除的數據必須包含在 on 子句定義的連接中。

示例:
原始數據
在這裏插入圖片描述

merge into emp a 
using (select 5 as empno from dual) b
on (a.empno < b.empno)
when matched then
  update set a.ename = 'DDD'
  DELETE WHERE a.empno = 4
when not matched then
	insert (empno,ename) values(5,'hahahaha');

執行 merge into 語句後的表數據:
在這裏插入圖片描述

3、注意事項

3.1 using 語句查詢結果不能爲空

如果 using 中的語句沒有查詢出數據(查詢結果爲空),是不會執行 update 和 insert 語句的,因爲這個語法是根據 using 中的查詢數據進行判斷的。如果 using on 能在目標表中匹配到數據,則執行更新操作,否則執行插入操作。
例:

merge into emp a 
using (select empno from emp where empno = 6) b
on (a.empno = b.empno)
when matched then
	update set a.ename = 'aaaaaa'
when not matched then
	insert (empno,ename) values(6,'BBBBBB');

在這裏插入圖片描述
由於 select empno from emp where empno = 6 查詢結果爲空,所以update操作和insert操作都沒有執行。

3.2 被更新的列不能作爲 on 過濾條件

例:

merge into emp a 
using (select ename from emp where ename = 'tom') b
on (a.ename = b.ename)
when matched then
	update set a.ename = 'CCC'
when not matched then
	insert (empno,ename) values(7,'DDD');

在這裏插入圖片描述

3.3 其他

  • on 後面的過濾條件是需要使用括號的。
  • insert 語句沒有 into,也勿需指定表名。

參考:
https://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_9016.htm
https://www.jianshu.com/p/8f51ce60d9ba

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章