我们产品现在要开始支持国产数据库,比如OB。我们有些SQL会用审核表的数据更新正式表,mysql类似 update TA a,TB b set ... where a.id=b.id这样的写法;oracle用update TA set(...)=select xxx from TB where ...的写法。在OB中应该怎么写?
最新的版本支持多表更新了,2.2.76跟mysql一样可以update xxx t1,yyy t2这样更新了。字符集也支持GBK了
一、创建测试表和添加测试数据 CREATE TABLE t_test01( user_id varchar2(20) primary key, user_name varchar2(10), remark varchar2(100) default null );
INSERT INTO t_test01 SELECT '1001','jiajia','你好啊' FROM dual UNION ALL SELECT '1002','maimai','' FROM dual UNION ALL SELECT '1003','yangyang','' FROM dual UNION ALL SELECT '1004','qianqian','' FROM dual UNION ALL SELECT '1005','huahua','' FROM dual; COMMIT;
SELECT * FROM t_test01
CREATE TABLE t_test02( user_id varchar2(20), user_name varchar2(10), address varchar2(100) default null )
INSERT INTO t_test02 SELECT '1002','xiaoyue','' FROM dual UNION ALL SELECT '1003','chengzi','' FROM dual UNION ALL SELECT '1004','lili','' FROM dual; COMMIT;
SELECT * FROM t_test01; SELECT * FROM t_test02;
二、更新处理方法 1、采用更新内嵌视图集的处理 UPDATE ( SELECT a.user_name,b.user_name AS user_name01 FROM t_test01 a,t_test02 b WHERE a.user_id=b.user_id ) SET user_name=user_name01; COMMIT;
--但是在执行时报如下错误: ORA-01779:无法修改与非键值保存表对应的列,如图所示:
Oracle中多表联合更新处理方法详解 错误说明:子查询的结果中,更新数据源(t_test02)的内容不唯一,导致被更新对象(t_test01)中的一行可能对应数据源(t_test02)中的多行。
该解决过程: --1.去重后创建唯一索引 CREATE UNIQUE INDEX t_test02_idx ON t_test02(user_id); 在创建唯一索引之后,就可以执行更新处理了。
SELECT * FROM t_test01;
--2.强制 Oracle 执行,方法是加上 BYPASS_UJVC 注释 UPDATE ( SELECT a.user_name,b.user_name AS user_name01 FROM t_test01 a,t_test02 b WHERE a.user_id=b.user_id ) SET user_name=user_name01; COMMIT;
2、采用MERGE INTO 实现更新 MERGE INTO t_test01 a USING t_test02 b ON (a.user_id=b.user_id) WHEN MATCHED THEN UPDATE SET a.user_name=b.user_name; COMMIT;
3、采用Oracle常规更新 UPDATE t_test01 a SET a.user_name=(SELECT user_name FROM t_test02 b WHERE a.user_id=b.user_id) WHERE EXISTS (SELECT 1 FROM t_test02 b WHERE a.user_id=b.user_id); COMMIT;
二、结果分析和建议
方法1的更新处理速度相对较快些; 方法3的更新处理速度相对较慢,平时使用中一般建议使用第一种,第二种方法
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。