您的位置:首页 > 数据库 > Oracle

Oracle中多表联合更新处理方法详解

2017-01-25 09:13 453 查看
ORACLE中多表关联更新与SQL Server和MYSQL的语法稍有不同,现将ORACLE中多表关联更新的几种方法处理如下:

一、创建测试表和添加测试数据

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:无法修改与非键值保存表对应的列,如图所示:





错误说明:子查询的结果中,更新数据源(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的更新处理速度相对较慢,平时使用中一般建议使用第一种,第二种方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: