0

0

ORACLE 关连更新 update select

php中文网

php中文网

发布时间:2016-06-07 15:37:19

|

1358人浏览过

|

来源于php中文网

原创

日月明王 http://sunmoonking.spaces.live.com 今天写了个复杂的sql,用来更新另一个表 select vin,(max(in_mileage)-min(in_mileage))/(max(start_time)-min(start_time)) from (select vin,in_mileage,start_timefrom (select vin,in_mileage,start_time ,r

日月明王

http://sunmoonking.spaces.live.com

今天写了个复杂的sql,用来更新另一个表

select vin,(max(in_mileage)-min(in_mileage))/(max(start_time)-min(start_time)) from (  select vin,in_mileage,start_time  from (select vin,in_mileage,start_time ,  row_number() over (partition by vin order by start_time) wwmnum from (select  vin,max(in_mileage) in_mileage,max(start_time) start_time from (select vin,in_mileage,start_time from tt_repair_order   union select vin,in_mileage,start_time  from tt_ro_balanced)   group by vin,to_char(start_time,'yyyymmdd') ) )  where wwmnum0 and to_char(max(start_time),'yyyymmdd')to_char(min(start_time),'yyyymmdd')

写完这个SQL交给程序员后,程序员跟我说不会UPDATE,也就是说通过B表更新A表程序员是有困难的,于是在这里整理下各种不同的方法以供以后使用.

$ sqlplus user/pass

SQL*Plus: Release 9.2.0.6.0 - Production on Wed Aug 2 17:38:39 2006

Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.

Connected to: Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.6.0 - Production

SQL> select * from wwm2;        --要更新的表

TOWN                         ID -------------------- ---------- 222                         222 111                         111 ww'jj                       111 llll                       1111 dddd                       2222 lllldf                      111 lllldf                      111 dsafdf                      111 3435                        111 ljjjjj                      222 dsafdf                      111

TOWN                         ID -------------------- ---------- 3435                        111 ljjjjj                      222

SQL> select * from wwm5;            --更新的条件表

TOWN                         ID -------------------- ---------- lllldf                      111 test                       9984

SQL> select wwm2.* from wwm2,wwm5 where wwm2.id=wwm5.id   2  /

TOWN                         ID -------------------- ---------- 111                         111 ww'jj                       111 lllldf                      111 lllldf                      111 dsafdf                      111 3435                        111 dsafdf                      111 3435                        111

8 rows selected.

所以,每次需要更新8条数据就是正确的.

相信程序员是通过以下类似的SQL更新的,这是错误的,因为没有加WHERE SQL>  update wwm2 set wwm2.town=(select wwm5.town from wwm5 where wwm5.id=wwm2.id)   2  /

13 rows updated.

SQL> select * from wwm2;

TOWN                         ID -------------------- ----------                             222 lllldf                      111 lllldf                      111                            1111                            2222 lllldf                      111 lllldf                      111 lllldf                      111 lllldf                      111                             222 lllldf                      111

TOWN                         ID -------------------- ---------- lllldf                      111                             222 13 rows selected.

可以看到13条记录被更新,符合条件的更新正确,不符合条件的也更新为NULL.以下是正确的方法

方法一: SQL> update wwm2   2  set town=(select town from wwm5 where wwm5.id=wwm2.id)   3  where id=(select wwm5.id from wwm5 where wwm5.id=wwm2.id)   4  /

8 rows updated.

方法二:    与方法一道理相同,这里需要掌握EXIST的相关用法. SQL> update wwm2    set town=(select town from wwm5 where wwm5.id=wwm2.id)    where exists (select 1 from wwm5 where wwm5.id=wwm2.id) 8 rows updated.

方法三: SQL> update (select a.town atown,a.id aid,b.town btown,b.id bid from wwm2 a,wwm5 b where a.id=b.id)   2  set atown=btown   3  / set atown=btown     * ERROR at line 2: ORA-01779: cannot modify a column which maps to a non key-preserved table

  1* alter table wwm5 add primary key (id) SQL> /

Table altered.

  1  update (select a.town atown,a.id aid,b.town btown,b.id bid from wwm2 a,wwm5 b where a.id=b.id)   2*  set atown=btown SQL> /

8 rows updated.

这种方法的局限性就是需要PRIMARY 的支持.

多多校园网络店铺
多多校园网络店铺

v3.3增加是否允许用户注册选项,重些登陆验证代码,取消SessionTimeout设置,改成前后台登陆验证设置,重写短消息单元,所有短信功能在个页面完成,更改相关短信连接和图片设置,美化相关小图片,修正若干个小问题,全新界面正装上市丰富用户字段,重命名相关文件,以方便使用管理,适合开发规范,重写修改密码,修改资料,店铺标志上传,店铺公告,店铺连接代码,店铺资料修改,商品发布、修改、删除功能,二手

下载

方法四:   1  declare   2  cursor cur_wwm is select town,id from wwm5;   3  begin   4     for my_wwm in cur_wwm loop   5     update wwm2 set town=my_wwm.town   6     where id=my_wwm.id;   7     end loop;   8* end; SQL> /

PL/SQL procedure successfully completed.

SQL> select * from wwm2;

TOWN                         ID -------------------- ---------- 222                         222 lllldf                      111 lllldf                      111 llll                       1111 dddd                       2222 lllldf                      111 lllldf                      111 lllldf                      111 lllldf                      111 ljjjjj                      222 lllldf                      111

TOWN                         ID -------------------- ---------- lllldf                      111 ljjjjj                      222

这个方法是最灵活的了.

方法五:

注意,方法五只能适用于WWM5是WWM2的子集的时候.   1   merge into wwm2   2   using (select town,id from wwm5) b   3   on (wwm2.id=b.id)   4   when matched then update set town=b.town   5* when not matched then insert (town,id) values (null,null) SQL> /

9 rows merged.

SQL> select * from wwm2;

TOWN                         ID -------------------- ----------                                   ---注意这个地方,被插入了一个空值.因为WWM5的ID=9984在WWM2中不能匹配,根本原因是ORACLE9必须有WHEN NOT MATCHED子句,但是ORACLE10可以不许要,也就是ORACLE10可以不写WHEN NOT MATCHED ,就不必插入NULL值了,为解决这个问题,下一步会DELETE WWM5的ID=9984,这样一来就不会执行WHEN NOT MATCHED 222                         222 lllldf                      111 lllldf                      111 llll                       1111 dddd                       2222 lllldf                      111 lllldf                      111 lllldf                      111 lllldf                      111 ljjjjj                      222

TOWN                         ID -------------------- ---------- lllldf                      111 lllldf                      111 ljjjjj                      222

14 rows selected.

SQL> delete from wwm5 where id=9984;

1 row deleted.

SQL>  1   merge into wwm2                             SQL>   2   using (select town,id from wwm5) b SQL>   3   on (wwm2.id=b.id) SQL>   4   when matched then update set town=b.town SQL>   5* when not matched then insert (town,id) values (null,null) SQL> /

8 rows merged.

 

       以上就是5种关连更新的例子了,希望能给开发人员解惑.

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.6万人学习

Java 教程
Java 教程

共578课时 | 50.6万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号