目錄
日月明王
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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
2 週前 By 尊渡假赌尊渡假赌尊渡假赌
倉庫:如何復興隊友
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver 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 09, 2024 pm 09:33 PM

oracle中某個字元出現的次數怎麼看出來

oracle資料庫伺服器硬體配置需求 oracle資料庫伺服器硬體配置需求 May 10, 2024 am 04:00 AM

oracle資料庫伺服器硬體配置需求

oracle需要多少內存 oracle需要多少內存 May 10, 2024 am 04:12 AM

oracle需要多少內存

Windows永久暫停更新,Windows關閉自動更新 Windows永久暫停更新,Windows關閉自動更新 Jun 18, 2024 pm 07:04 PM

Windows永久暫停更新,Windows關閉自動更新

KDE Plasma 6.1 為流行的 Linux 桌面帶來了許多增強功能 KDE Plasma 6.1 為流行的 Linux 桌面帶來了許多增強功能 Jun 23, 2024 am 07:54 AM

KDE Plasma 6.1 為流行的 Linux 桌面帶來了許多增強功能

See all articles