概述
随着系统功能的调整和升级,原先数据库表结构已无法适应新的需求,导致查询相关数据困难,这时就需要对数据库表结构进行调整,比如增加冗余字段,以方便查询统计数据。在数据库中经常需要用一张表数据更新另一张表,进行数据冗余。在Oracle中想要实现该需求,有两种方式可选。
准备相关测试表
需要两张表,分别是tb_course和tb_teacher_school,也就是课程表和老师学校对应表。课程表有课程作者,标题,等等。如果要统计学校内所有课程就需要查询该学校内所有老师,然后关联课程表,很麻烦。如果给课程表维护一个作者所属的schoolId,查询就会方便很多。
第一种方法
使用update语句直接更新:
update tb_course c set c.schoolid = (
select ts.schoolid from tb_teacher_school ts where ts.teacherid = c.authorid
)
where exists(select 1 from tb_teacher_school ts where ts.teacherid = c.authorid)
切记:一定要加exists条件语句,不然tb_course表中原先schoolid有值的数据如果在tb_teacher_school中如果没有对应的schoolid,那么原先的schoolid也会被清空,赋值为NULL.
第二种方法
使用merge into语句:
merge into tb_course c
using tb_teacher_school ts on(c.teacherid = ts.authorid)
when matched then update set c.schoolid = ts.schoolid
总结
首选第一种方式,第二种方式用到的merge into语句功能其实更强大,并不是专用于该场景,更多用于表数据合并。另外,需要注意的是另一张表的数据不能匹配到多行,比如在tb_teacher_school表匹配到两条数据,这样执行语句就会报错。