开发者社区> 问答> 正文

OB如何处理多表更新

我们产品现在要开始支持国产数据库,比如OB。我们有些SQL会用审核表的数据更新正式表,mysql类似 update TA a,TB b set ... where a.id=b.id这样的写法;oracle用update TA set(...)=select xxx from TB where ...的写法。在OB中应该怎么写?

展开
收起
游客zanfbcb4dtwjc 2020-12-04 10:05:02 870 0
2 条回答
写回答
取消 提交回答
  • 最新的版本支持多表更新了,2.2.76跟mysql一样可以update xxx t1,yyy t2这样更新了。字符集也支持GBK了

    2021-06-01 18:23:05
    赞同 展开评论 打赏
  • 一、创建测试表和添加测试数据 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的更新处理速度相对较慢,平时使用中一般建议使用第一种,第二种方法

    2021-02-09 16:10:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Phoenix 全局索引原理与实践 立即下载
PostgresChina2018_赖思超_PostgreSQL10_hash索引的WAL日志修改版final 立即下载
事务、全局索引、透明分布式 立即下载