在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
很多时候我们会出现如下情境,如果一条数据在表中已经存在,对其做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 举一反三啦,很多时候都可以用到的,整理自网络 |
请发表评论