oracle update join 多表关联查询
oracle update join 多表关联查询 今天需要写一个根据关联查询结果更新数据的sql,mysql中支持这样的语法:
mysql: UPDATE T1, T2, [INNER JOIN | LEFT JOIN] T1 ON T1.C1 = T2. C1 SET T1.C2 = T2.C2, T2.C3 = expr WHERE condition
但是oracle不支持上面的语法,oracle实现上面功能的语法结构如下:
oracle 方式1: UPDATE table1 SET table1.value = (SELECT table2.CODE FROM table2 WHERE table1.value = table2.DESC) WHERE table1.UPDATETYPE=‘blah’ AND EXISTS (SELECT table2.CODE FROM table2 WHERE table1.value = table2.DESC); 或者
oracle 方式2: UPDATE (SELECT table1.value as OLD, table2.CODE as NEW FROM table1 INNER JOIN table2 ON table1.value = table2.DESC WHERE table1.UPDATETYPE=‘blah’ ) t SET t.OLD = t.NEW
实际上面在线上环境执行,风险还是比较高的,比较推荐还是直接输出执行脚本后执行,这样就算有问题也可以将问题范围控制在脚本范围内;
SELECT ‘update table_update set field=’‘’||update_field||‘’‘,ts=to_char(sysdate,’‘yyyy-mm-dd hh24:mi:ss’‘) where key_field=’‘’||query_field||‘’‘;’ from( select query_field_key,update_field from table1 t1 inner join table2 t2 on t1.field=t2.field )
方式3: merge into merge into b using a on (a.CODE=b.CODE ) when matched then update set b.DESCRIPTION=a.DESCRIPTION //[delete where (a.CODE=‘2’)] when not matched then insert values (a.NAME, a.CODE, a.DESCRIPTION,a.THRDR) where a.CODE = ‘2’