<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Jhonney的專(zhuān)欄

       ----人見(jiàn)人愛(ài)
    隨筆 - 49, 文章 - 1, 評(píng)論 - 23, 引用 - 0
    數(shù)據(jù)加載中……

    ORACLE 關(guān)連更新 update select

    $ 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條數(shù)據(jù)就是正確的.
    相信程序員是通過(guò)以下類(lèi)似的SQL更新的,這是錯(cuò)誤的,因?yàn)闆](méi)有加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的相關(guān)用法.
    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
    這個(gè)方法是最靈活的了.
    方法五:
    注意,方法五只能適用于WWM5是WWM2的子集的時(shí)候.
      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
    -------------------- ----------
                                      ---注意這個(gè)地方,被插入了一個(gè)空值.因?yàn)閃WM5的ID=9984在WWM2中不能匹配,根本原因是ORACLE9必須有WHEN NOT MATCHED子句,但是ORACLE10可以不許要,也就是ORACLE10可以不寫(xiě)WHEN NOT MATCHED ,就不必插入NULL值了,為解決這個(gè)問(wèn)題,下一步會(huì)DELETE WWM5的ID=9984,這樣一來(lái)就不會(huì)執(zhí)行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種關(guān)連更新的例子了,希望能給開(kāi)發(fā)人員解惑.
     
    說(shuō)明:如果select 子句可以返回多行記錄,但返回適合where條件的記錄只能是唯一的,否則將會(huì)報(bào)返回單行的select子句返回多行的錯(cuò)誤,因?yàn)閡pdate只能跟據(jù)此處的where子句(內(nèi)層where)進(jìn)行相應(yīng)記錄的匹配更新,一次只能是一條。

    posted on 2010-06-25 19:30 Jhonney 閱讀(17207) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 日本高清免费观看| a级毛片免费全部播放| 国产在线a免费观看| 久久亚洲精品国产精品| 欧洲人成在线免费| 亚洲高清视频在线观看| 久久中文字幕免费视频| 午夜影视日本亚洲欧洲精品一区| 免费在线中文日本| 亚洲四虎永久在线播放| 2020因为爱你带字幕免费观看全集| 麻豆亚洲AV永久无码精品久久| 99re免费99re在线视频手机版| 亚洲婷婷天堂在线综合| 久久精品无码一区二区三区免费| 亚洲精品无码专区| 免费a级毛片无码av| 国产午夜成人免费看片无遮挡| 亚洲av永久无码精品网站 | 亚洲日本中文字幕| 亚洲精品视频免费在线观看| 久久狠狠爱亚洲综合影院| 最近免费中文字幕视频高清在线看| 亚洲精品永久在线观看| 久久久久一级精品亚洲国产成人综合AV区| 精品国产免费人成网站| 久久久无码精品亚洲日韩蜜臀浪潮| 精品国产无限资源免费观看| 亚洲国产精品无码中文lv| 亚洲M码 欧洲S码SSS222| 最近的2019免费中文字幕| 亚洲视频一区网站| 国产精品二区三区免费播放心| 国产V片在线播放免费无码| 亚洲黄色在线观看| 国产男女猛烈无遮挡免费视频网站| 国产成人自产拍免费视频| 亚洲ts人妖网站| 国产福利电影一区二区三区,亚洲国模精品一区 | 99re热精品视频国产免费| 亚洲国产欧美日韩精品一区二区三区 |