今天開發(fā)碰到了一個很常見的問題话瞧,就是需要根據(jù)數(shù)據(jù)庫中是否存在來insert或update您没,以前的做法是
1.查詢記錄是否存在
select count(1) from table_name where ****;
2.判斷
如果>=1則update table_name
如果==0則insert table_name
新學習到的方法是使用MERGE INTO語法
MERGE INTO 表名
USING 表名/視圖/子查詢 ON 連接條件
-- 當匹配得上連接條件時
WHEN MATCHED THEN
更新疗琉、刪除操作
-- 當匹配不上連接條件時
WHEN NOT MATCHED THEN
更新、刪除尘盼、插入操作
MERGE INTO table_name alias1
USING (table | view | sub_query) alias2
ON (join condition)
WHEN MATCHED THEN
UPDATE table_name SET col1 = col_val1, col2 = col2_val
WHEN NOT MATCHED THEN
INSERT (column_list) VALUES (column_values);
簡單翻譯一下
操作alias1表中的數(shù)據(jù)
通過ON 中的條件進行過濾
存在執(zhí)行更新操作
不存在執(zhí)行插入操作
假設(shè)studen中name字段唯一
現(xiàn)在的業(yè)務(wù)場景是student中有叫小明的則更新小明的信息(age)
沒有叫小明的則插入小明的信息(name,age)
實現(xiàn)如下
merge into student stu
using (SELECT
nvl(max(student .name),0) name
FROM student
WHERE student .name= :'小明') s
on (stu.name=s.name)
when matched then
update set stu.age = '11'
when not matched then
insert ( name, age) values ( '小明', '10');
需要注意的地方
1.如果using中的語句什么都查不出來统舀,那么insert是不會執(zhí)行的
2.on中的條件不能作為更新列,否則會報錯
3.on中的條件一定要過濾準確澄港,否則會整表更新
目前就理解這么多
2020年4月27日記錄
發(fā)現(xiàn)一個問題,merge into 用as別名時會報錯,直接空格別名沒問題