목차
日月明王
http://sunmoonking.spaces.live.com
데이터 베이스 MySQL 튜토리얼 ORACLE 关连更新 update select

ORACLE 关连更新 update select

Jun 07, 2016 pm 03:37 PM
oracle select update 해와 달 고쳐 쓰다

日月明王 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 的支持.

方法四:   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种关连更新的例子了,希望能给开发人员解惑.

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

Oracle 데이터베이스 로그는 얼마나 오래 보관됩니까? Oracle 데이터베이스 로그는 얼마나 오래 보관됩니까? May 10, 2024 am 03:27 AM

Oracle 데이터베이스 로그는 얼마나 오래 보관됩니까?

Oracle 데이터베이스 시작 단계의 순서는 다음과 같습니다. Oracle 데이터베이스 시작 단계의 순서는 다음과 같습니다. May 10, 2024 am 01:48 AM

Oracle 데이터베이스 시작 단계의 순서는 다음과 같습니다.

Windows가 지정된 장치, 경로 또는 파일에 액세스할 수 없습니다. Windows가 지정된 장치, 경로 또는 파일에 액세스할 수 없습니다. Jun 18, 2024 pm 04:49 PM

Windows가 지정된 장치, 경로 또는 파일에 액세스할 수 없습니다.

Oracle 데이터베이스 서버 하드웨어 구성 요구 사항 Oracle 데이터베이스 서버 하드웨어 구성 요구 사항 May 10, 2024 am 04:00 AM

Oracle 데이터베이스 서버 하드웨어 구성 요구 사항

Oracle에서 특정 문자의 발생 횟수를 확인하는 방법 Oracle에서 특정 문자의 발생 횟수를 확인하는 방법 May 09, 2024 pm 09:33 PM

Oracle에서 특정 문자의 발생 횟수를 확인하는 방법

오라클에는 얼마나 많은 메모리가 필요합니까? 오라클에는 얼마나 많은 메모리가 필요합니까? May 10, 2024 am 04:12 AM

오라클에는 얼마나 많은 메모리가 필요합니까?

Windows는 업데이트를 영구적으로 일시 중지하고 Windows는 자동 업데이트를 끕니다. Windows는 업데이트를 영구적으로 일시 중지하고 Windows는 자동 업데이트를 끕니다. Jun 18, 2024 pm 07:04 PM

Windows는 업데이트를 영구적으로 일시 중지하고 Windows는 자동 업데이트를 끕니다.

Oracle 데이터베이스를 사용하는 데 필요한 메모리 양 Oracle 데이터베이스를 사용하는 데 필요한 메모리 양 May 10, 2024 am 03:42 AM

Oracle 데이터베이스를 사용하는 데 필요한 메모리 양

See all articles