Oracle數據庫之oracle update set select from 關聯更新

本文主要向大家介紹了Oracle數據庫之oracle update set select from 關聯更新,通過具體的內容向大家展現,希望對大家學習Oracle數據庫有所幫助。

   工作中有個需求,現在新表中有一些數據跟老表的基本一樣,這樣只需要把老表中數據搬到新表中就可以了,同時把不同的字段修改下數據即可,在修改字段時發 現,需要指定一個條件,比如主鍵id,來修改某條記錄,這樣一條一條修改效率太低了,有沒有批量操作的方式 呢?SQL>select * from wwn2;
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
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
TOWN                         ID
-------------------- ----------
111                         111
ww‘jj                       111
lllldf                      111
lllldf                      111
dsafdf                      111
3435                        111
dsafdf                      111
3435                        111
8 rows selected.

--需要更新8條數據是正確的

下面是一個錯誤的做法:
SQL>  update wwm2 set wwm2.town=(select wwm5.town from wwm5 where wwm5.id=wwm2.id)
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
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)

方法二:
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)

方法三:
  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;

說 明:如果select 子句可以返回多行記錄,但返回適合where條件的記錄只能是唯一的,否則將會報返回單行的select子句返回多行的錯誤,因爲 update只能跟據此處的where子句(內層where)進行相應記錄的匹配更新,一次只能是一條。實際使用的sql爲:
update table1 s set s.yesterday = (select yesterday from table1_BACK sb where sb.tagname = s.tagname and rownum = 1) where s.tagname = (select tagname from table1_BACK sb where sb.tagname = s.tagname);update table1 s set s.yesterday = (select yesterday from table1_BACK sb where sb.tagname = s.tagname and rownum = 1) where exists (select 1 from table1_BACK sb where sb.tagname = s.tagname);
 
轉自:http://m.zhizuobiao.com/oracle/oracle-18091000132/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章