MERGE 语句的用法,在数据场景下还是挺常见的。Oracle 的语法设计比较直白,WHEN MATCHED更新,WHEN NOT MATCHED插入,逻辑清晰,适合表之间的同步合并问题。

EMP 表和 BONUS 表的合并例子蛮实用的,是部门号筛选那块,WHERE deptno = 30写在子查询里,起来更灵活。代码在EXA_08.SQL文件里,搭配08_08.JPG看一眼结构图也挺直观。

语法结构大致长这样:

MERGE INTO bonus b
USING (SELECT * FROM emp WHERE deptno = 30) e
ON (b.ename = e.ename)
WHEN MATCHED THEN
  UPDATE SET b.sal = e.sal
WHEN NOT MATCHED THEN
  INSERT (ename, sal) VALUES (e.ename, e.sal);

如果你在做数据仓库同步、老表补数或者数据合并之类的活儿,这种写法挺省事。要注意ON条件要写准确,不然插入/更新会混掉。字段匹配最好提前检查下数据类型和精度。

想深入折腾的,可以看看下面这些参考,像EMP/DEPT 表在 MySQL 的映射,还有约束语句和建表 SQL,都挺实用的:

如果你也有整理数据的需求,建议把MERGE句型练熟,省得写一堆IF EXISTS的判断。嗯,Oracle 这一套还真挺好用。