oracle更新表时需要用到两个条件,并且这两个条件同其他表相关联;其他表查询时使用条件相同,但输出的字段不相同。
oracle不同于sql,不能在update语句后面写两个表,因此只能使用其他方法进行更新:
方法一,使用update:
update table_a set userlevel=‘中国’
where city in (select city from table_b where station=‘100’ and remark=‘200’)
and name in (select name from table_b where station=‘100’ and remark=‘200’);
这个方法是可以对 table_a 的 userlevel进行更新,
但就会存在问题,那就是更新的数据可能会不准
。因为set后面的这两个条件不是同时使用的,就会出现数据交叉重复的现象,导致数据更新不正确,因此不推荐使用,除非table_b查出来的city和name是唯一的或者主键。
方法二,使用merge into:
merge into table_a ta –需要更新的表
using (select * from table_b where station=‘100’ and remark=‘200’) tb2 –条件表
on (tb2.station=ta.station and tb2.remark=ta.remark) –条件,可以有多个,但不能和需要更新的字段相同
when matched then –当满足’on’中条件时就执行下面语句
update set o1.userlabel=‘中国’ –修改的内容
when not matched then –当不满足’on’中条件时就执行下面语句。不一定需要这个语句,看个人需要。
insert into xxx;
这个方法可以同时让两个条件相同,
不过会有一个缺陷
,那就是语句中 on 里面填写的条件不能和set的条件一致
。就比如这样:
merge into table_a ta
using (select * from table_b where station=‘100’ and remark=‘200’) tb2
on (tb2.station=ta.station and tb2.remark=ta.remark and
ta.userlabel=tb.userlabe
l) –on中不能有ta.userlabel这个字段
when matched then
update set ta.userlabel=‘中国’ ;
方法三,使用笨方法 insert into
修改时,可能会因为需要修改的字段是主键组成之一无法修改,或者出现方法二的情况时,我个人使用就是比较笨的方法:
①那就是先使用select 查询出相关数据;
②然后使用导出成sql语句功能;
③把导出的sql语句中想要修改的字段全部替换成想要的字段;
④删除表中相关的数据
⑤插入步骤③中修改好的sql语句