Oracle MERGE INTO的用法示例介绍

时间:2022-08-29 22:49:33

很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做update,如果不存在,将新的数据插入.如果不使用Oracle提供的merge语法的话,可能先要上数据库select查询一下看是否存在,然后决定怎么操作,这样的话需要写更多的代码,同时性能也不好,要来回数据库两次.使用merge的话则可以一条SQL语句完成. 

1)主要功能 
提供有条件地更新和插入数据到数据库表中 
如果该行存在,执行一个UPDATE操作,如果是一个新行,执行INSERT操作 
— 避免了分开更新 
— 提高性能并易于使用 
— 在数据仓库应用中十分有用 

2)MERGE语句的语法如下: 

复制代码代码如下:


MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] 
{ table | view | subquery } [t_alias] ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;


3)示例 

复制代码代码如下:


MERGE INTO TABLE TARGET 
USING (SELECT '111111111' STORE_NO, 
'2014-01' TARGET_YM, 
'1' TARGET_D01, 
'2' TARGET_D02, 
'2' TARGET_D03, 
'2' TARGET_D04, 
'2' TARGET_D05, 
'2' TARGET_D06, 
'2' TARGET_D07, 
'2' TARGET_D08, 
'2' TARGET_D09, 
'2' TARGET_D10, 
'2' TARGET_D11, 
'2' TARGET_D12, 
'2' TARGET_D13, 
'2' TARGET_D14, 
'2' TARGET_D15, 
'2' TARGET_D16, 
'2' TARGET_D17, 
'2' TARGET_D18, 
'2' TARGET_D19, 
'2' TARGET_D20, 
'2' TARGET_D21, 
'2' TARGET_D22, 
'2' TARGET_D23, 
'2' TARGET_D24, 
'2' TARGET_D25, 
'2' TARGET_D26, 
'2' TARGET_D27, 
'2' TARGET_D28, 
'2' TARGET_D29, 
'2' TARGET_D30, 
'2' TARGET_D31, 
1 USER_ID 
FROM DUAL) TEMP 
ON (TARGET.STORE_NO = TEMP.STORE_NO AND TARGET.TARGET_YM = TEMP.TARGET_YM) 
WHEN MATCHED THEN 
UPDATE 
SET TARGET.TARGET_D01 = TEMP.TARGET_D01, 
TARGET.TARGET_D02 = TEMP.TARGET_D02, 
TARGET.TARGET_D03 = TEMP.TARGET_D03, 
TARGET.TARGET_D04 = TEMP.TARGET_D04, 
TARGET.TARGET_D05 = TEMP.TARGET_D05, 
TARGET.TARGET_D06 = TEMP.TARGET_D06, 
TARGET.TARGET_D07 = TEMP.TARGET_D07, 
TARGET.TARGET_D08 = TEMP.TARGET_D08, 
TARGET.TARGET_D09 = TEMP.TARGET_D09, 
TARGET.TARGET_D10 = TEMP.TARGET_D10, 
TARGET.TARGET_D11 = TEMP.TARGET_D11, 
TARGET.TARGET_D12 = TEMP.TARGET_D12, 
TARGET.TARGET_D13 = TEMP.TARGET_D13, 
TARGET.TARGET_D14 = TEMP.TARGET_D14, 
TARGET.TARGET_D15 = TEMP.TARGET_D15, 
TARGET.TARGET_D16 = TEMP.TARGET_D16, 
TARGET.TARGET_D17 = TEMP.TARGET_D17, 
TARGET.TARGET_D18 = TEMP.TARGET_D18, 
TARGET.TARGET_D19 = TEMP.TARGET_D19, 
TARGET.TARGET_D20 = TEMP.TARGET_D20, 
TARGET.TARGET_D21 = TEMP.TARGET_D21, 
TARGET.TARGET_D22 = TEMP.TARGET_D22, 
TARGET.TARGET_D23 = TEMP.TARGET_D23, 
TARGET.TARGET_D24 = TEMP.TARGET_D24, 
TARGET.TARGET_D25 = TEMP.TARGET_D25, 
TARGET.TARGET_D26 = TEMP.TARGET_D26, 
TARGET.TARGET_D27 = TEMP.TARGET_D27, 
TARGET.TARGET_D28 = TEMP.TARGET_D28, 
TARGET.TARGET_D29 = TEMP.TARGET_D29, 
TARGET.TARGET_D30 = TEMP.TARGET_D30, 
TARGET.TARGET_D31 = TEMP.TARGET_D31, 
TARGET.OPT_COUNTER = TARGET.OPT_COUNTER + 1, 
TARGET.UPDATE_BY = TEMP.USER_ID, 
TARGET.UPDATE_DATE = SYSDATE 
WHEN NOT MATCHED THEN 
INSERT 
VALUES 
(SEQ.NEXTVAL, 
TEMP.STORE_NO, 
TEMP.TARGET_YM, 
TEMP.TARGET_D01, 
TEMP.TARGET_D02, 
TEMP.TARGET_D03, 
TEMP.TARGET_D04, 
TEMP.TARGET_D05, 
TEMP.TARGET_D06, 
TEMP.TARGET_D07, 
TEMP.TARGET_D08, 
TEMP.TARGET_D09, 
TEMP.TARGET_D10, 
TEMP.TARGET_D11, 
TEMP.TARGET_D12, 
TEMP.TARGET_D13, 
TEMP.TARGET_D14, 
TEMP.TARGET_D15, 
TEMP.TARGET_D16, 
TEMP.TARGET_D17, 
TEMP.TARGET_D18, 
TEMP.TARGET_D19, 
TEMP.TARGET_D20, 
TEMP.TARGET_D21, 
TEMP.TARGET_D22, 
TEMP.TARGET_D23, 
TEMP.TARGET_D24, 
TEMP.TARGET_D25, 
TEMP.TARGET_D26, 
TEMP.TARGET_D27, 
TEMP.TARGET_D28, 
TEMP.TARGET_D29, 
TEMP.TARGET_D30, 
TEMP.TARGET_D31, 
NULL, 
DEFAULT, 
DEFAULT, 
NULL, 
TEMP.USER_ID, 
DEFAULT, 
NULL, 
NULL); 


小帮助: 

看到数据库表这么多字段是不是好烦,拷贝、写都麻烦还容易出错,可以如下操作: 

1、先查询出表的所有字段 

复制代码代码如下:


SELECT COLUMN_ID, 
COLUMN_NAME, 
DATA_TYPE, 
DATA_LENGTH, 
DATA_PRECISION, 
DATA_SCALE, 
NULLABLE, 
DATA_DEFAULT 
FROM USER_TAB_COLUMNS 
WHERE TABLE_NAME = 'TABLE' 
ORDER BY COLUMN_ID 


2、将该表列名拷贝到Excel,使用函数CONCATENATE 
Oracle MERGE INTO的用法示例介绍 
举一反三啦,很多时候都可以用到的,整理自网络