Oracle MERGE语句USING子句返回空值时插入操作未触发问题
Oracle MERGE语句在USING子句返回空结果时的行为分析
核心结论
Oracle MERGE语句的执行逻辑是遍历USING子句返回的每一行数据,与目标表(target)进行匹配:
- 如果USING子句返回空结果集,没有任何行可以用来触发匹配或插入操作,因此
WHEN NOT MATCHED分支不会执行。
你的代码问题分析
你当前的USING子句是从target和src做内连接查询:
SELECT DISTINCT A.col1,B.col1,A.col2 FROM target A JOIN src B ON A.col1=B.col1 AND B.col2 =A.col2
这个查询只会返回target和src中已经存在匹配关系的行,当src中有新数据(target里没有)时,内连接根本查不到结果,导致USING返回空,自然无法触发插入。
正确的实现方式
要实现“src中存在的记录,在target存在则更新,不存在则插入”,USING子句应该直接取src的数据源,而非和target做内连接。修正后的代码示例:
MERGE INTO target tar USING ( SELECT DISTINCT col1, col2 FROM src -- 直接取src的目标字段 ) src ON (src.col1 = tar.col1 AND src.col2 = tar.col2) WHEN MATCHED THEN UPDATE SET tar.col4 = 37, tar.col5 = 6, tar.col6 = SYSDATE, tar.col7 = 123, tar.col8 = SYSDATE, tar.col9 = 123 WHEN NOT MATCHED THEN INSERT (tar.col1, tar.col2, tar.col3, tar.col4) VALUES (src.col1, src.col2, 37, 6); -- 注意去掉原语句末尾多余的逗号
额外语法修正
原代码中INSERT的VALUES子句末尾多了一个逗号,属于语法错误,执行时会报错,需要删除。
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

