如果你遇到这样的情况:存在对一张数据量很大的表,你需要对里面的大量数据进行更新,如果数据不存在,就进行插入的操作。那么你会怎么做呢?是不是先根据条件查询一番,如果存在,那么就更新,否则就插入?其实,你大可不必这么做。Oracle9i 后可以用merge into轻轻松松搞定这个问题,避免多次的查询判断以及更新插入操作。
1.merge into简介
用来合并UPDATE和INSERT语句。通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE
2.merge into语法
-
MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
-
WHEN MATCHED THEN
-
[UPDATE sql]
-
WHENNOT MATCHED THEN
-
[INSERT sql]
-
作用:判断B表和A表是否满足ON中条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表
3.merge into简单示例分析
利用merge into实现【如果原先库存中存在这个商品,那么就直接更新,否则就插入的操作】:
-
MERGE INTO STOCK A USING GOODS B ON (A.NAME=B.NAME)
-
WHEN MATCHED THEN
-
UPDATE SET A.REST=A.REST+B.NUM
-
WHEN NOT MATCHED THEN
-
INSERT(A.ID,A.NAME,A.REST) VALUES((select max(ID)+1 from STOCK),B.NAME,B.NUM);
-
COMMIT;
当上面的语句执行后,查询stock库存表如下: