Oracle中多表联合更新处理方法详解
来源:互联网 发布:一个直播软件多少钱 编辑:程序博客网 时间:2024/06/06 20:43
一、创建测试表和添加测试数据
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
3、采用Oracle常规更新
UPDATE t_test01
SET a.user_name=(SELECT user_name FROM
WHERE EXISTS (SELECT 1 FROM t_test02 b WHERE a.user_id=b.user_id);
COMMIT;
二、结果分析和建议
方法1的更新处理速度相对较快些;
方法3的更新处理速度相对较慢,平时使用中一般建议使用第一种,第二种方法。
- Oracle中多表联合更新处理方法详解
- oracle 多表联合更新
- Oracle多表联合更新
- oracle 多表联合更新
- oracle中多表联合查询
- oracle处理丢失更新
- ORACLE批量更新方法
- oracle更新及实物处理
- 【oracle】事务更新及处理
- SQL Update多表联合更新的方法
- SQL Update多表联合更新的方法 .
- SQL Update多表联合更新的方法
- SQL Update多表联合更新的方法
- SQL Update多表联合更新的方法
- SQL Update多表联合更新的方法
- oracle多表联合查询加gruop by处理
- oracle:PK,Fk,联合主键,NOTNULL 约束详解
- 用ADO.Net实现Oracle大批量数据更新优化处理方法
- su: cannot set user id: Resource temporarily unavailable 问题分析和解决
- ThinkPHP框架----控制器调用模型里的方法,一直报错——Think\Model:..方法不存在!
- 【Oracle批量更新】根据一个大表批量更新另一大表的方法比较
- [Node.js]EventEmitter
- ie8不支持fixed以及jquery版本问题
- Oracle中多表联合更新处理方法详解
- Consecutive Tree Sequence
- mac 安装消息中间件---ActiveMQ
- Dlib+Vs2015配置
- winform 把窗口上的全部信息生成PDF文件显示
- 三星电子及时处理Note7燃损原因已查明
- C++编码器军规(003):避免对一个声明为const的变量使用const_cast
- 2016年知名企业阵亡名单丨不在变革中爆发,就在骄傲中死亡
- QString 保留小数点后一位数 & QT int 转16进制QString并补零