merge into 和 update简单分析

元气小坏坏 提交于 2020-01-19 15:24:01

merge into 和 update

  • 创建实验数据
--创建学生表
create table student(id varchar2(9) not null primary key,name varchar2(40) not null,classnum number(2) not null,subject varchar2(40));

--创建教师表
create table teacher(tid varchar2(9) not null primary key,tname varchar2(40) not null,classnum number(2) not null,subject varchar2(40));

--分别向两张表表批量添加数据
INSERT ALL 
INTO student(id,name,classnum,subject) VALUES ('001','zhangsan',1,'语文') 
INTO student(id,name,classnum,subject) VALUES ('002','lisi',2,'数学') 
INTO student(id,name,classnum,subject) VALUES ('003','wangwu',3,'历史')
SELECT 1 FROM DUAL;


INSERT ALL 
INTO teacher(tid,tname,classnum,subject) VALUES ('00001','jack',2,'英语') 
INTO teacher(tid,tname,classnum,subject) VALUES ('00002','mike',3,'英语') 
INTO teacher(tid,tname,classnum,subject) VALUES ('00003','merry',4,'英语')
SELECT 1 FROM DUAL;

分别查询两张表
student:
student
teacher:
在这里插入图片描述
现在将学生表相同班级的学生科目同步到教师表中相同班级的科目字段如果使用

update语句1:
UPDATE teacher a
   SET (a.subject) =
       (SELECT b.subject FROM student b WHERE a.classnum = b.classnum)

查询教师表:
在这里插入图片描述
缺点

  1. 没有匹配上“WHERE a.classnum = b.classnum”这个条件的科目被置为空,故此sql语句同步数据有隐患
  2. 该sql是update每一条数据中的subject,将其修改成select子查询中的结果,在数据量很大的时候,如果存在着很多匹配不上的数据,无疑是很浪费性能的
update语句2:
UPDATE teacher a
   SET (a.subject) =
       (SELECT b.subject FROM student b WHERE a.classnum = b.classnum)
WHERE EXISTS (SELECT 1
             FROM student b
             WHERE a.classnum = b.classnum)

查询教师表:
在这里插入图片描述
这中写法解决了缺点1没有匹配上的数据subject列被篡改,但是缺点2仍然存在,因为依然where每一条数据去判断是否存这个条件,如果不存在就清空掉那一条update语句,最后再commit,所以仍然存在性能问题

update语句3
MERGE INTO teacher a
USING student b
ON (a.classnum = b.classnum)
WHEN MATCHED THEN
  UPDATE SET a.subject = b.subject

查询教师表:
在这里插入图片描述
因为语句3是将符合条件的数据查询出来,然后再一次性update,故这种效率最高

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!