在达梦数据库的官方文档里有介绍merge into的用发,可以参考
merge into的使用
这个示例里用到的语句是
MERGE INTO dmhr.dup_emp
USING dmhr.emp_salary
ON (dmhr.dup_emp.employee_id = dmhr.emp_salary.employee_id)
WHEN MATCHED
THEN
UPDATE SET dmhr.dup_emp.salary = dmhr.emp_salary.new_salary
WHEN NOT MATCHED
THEN
INSERT VALUES (dmhr.emp_salary.employee_id,
'dm2020',
410107197103257999,
dmhr.emp_salary.new_salary,
102);
这个示例问题,就是只介绍了一个字段更新时的情况,还只介绍了全字段更新的情况,这种情况算是比较特殊了,想更新多个字段,插入部分字段怎么写呢?查阅了一些资料,得到的结论是
MERGE INTO dmhr.dup_emp a
USING dmhr.emp_salary b
ON (a.employee_id = b.employee_id)
WHEN MATCHED
THEN
UPDATE SET a.salary = b.new_salary,
a.department_id=b.department_id
WHEN NOT MATCHED
THEN
INSERT (a.department_id,a.salary) VALUES (b.employee_id,b.new_salary);
可以看到:
- 多个更新操作中间用逗号隔开即可
- 特定多个字段插入,在INSERT语句后填入“目标表名.字段名”,在VALUES中填入“源表名.字段名”即可。
有一点需要注意的,我用以下方式时候报错,所以还是能将表起别名就起个别名,用起来也方便
错误示范:
MERGE INTO dmhr.dup_emp a
USING dmhr.emp_salary b
ON (dmhr.dup_emp.employee_id = dmhr.emp_salary.employee_id)
WHEN MATCHED
THEN
UPDATE SET dmhr.dup_emp.salary = dmhr.emp_salary.new_salary,
dmhr.dup_emp.department_id=dmhr.emp_salary.department_id
WHEN NOT MATCHED
THEN
INSERT (dmhr.dup_emp.department_id,dmhr.dup_emp.salary)
VALUES (dmhr.emp_salary.employee_id,dmhr.emp_salary.new_salary);