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:
teacher:
现在将学生表相同班级的学生科目同步到教师表中相同班级的科目字段如果使用
update语句1:
UPDATE teacher a
SET (a.subject) =
(SELECT b.subject FROM student b WHERE a.classnum = b.classnum)
查询教师表:
缺点:
- 没有匹配上“WHERE a.classnum = b.classnum”这个条件的科目被置为空,故此sql语句同步数据有隐患
- 该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,故这种效率最高
来源:CSDN
作者:漫漫茫茫
链接:https://blog.csdn.net/m0_38120426/article/details/104037345