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

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

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

    Decode360's Blog

    業(yè)精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 ::  :: 管理 ::
      302 隨筆 :: 26 文章 :: 82 評論 :: 0 Trackbacks
    ??? PLSQL中操作數(shù)據(jù)轉(zhuǎn)化過程中經(jīng)常會用到MERGE語句, MERGE函數(shù)是Oracle9i新增的函數(shù),基本上就是等于update和insert兩個函數(shù)的相加。使用MERGE函數(shù),通過判斷兩個表之間某字段的關(guān)聯(lián)情況,如果關(guān)聯(lián)匹配上的話就進(jìn)行update操作,如果沒有匹配就執(zhí)行insert。這個函數(shù)一來是減少了程序的長度,而且只對表進(jìn)行一次全表掃描,效率也會有所提高。

    ??? 1、 簡單舉例:
    ?

    ??? create table t1_a as

    ???? ? select rownum id ,table_name name

    ??????? from user_tables;

    ?

    ??? create table t1_b as

    ???? ? select rownum id ,table_name name

    ??????? from user_tables

    ?????? where table_name like 'T%' ; -- t1_a 記錄少

    ?

    ??? merge into t1_b

    ??? using t1_a

    ??? on (t1_b.name = t1_a.name)

    ??? when matched then

    ???? ? update set t1_b.id = t1_b.id + 100000

    ??? when not matched then

    ???? ? insert values (t1_a.id, t1_a.name);

    ??? --t1_b 表中沒有的記錄插入,有的記錄把 id+100000

    ?
    ??? 注:被修改的必然是在前面的表,后面的表是附加進(jìn)來進(jìn)行判斷的。
    ?
    ?
    ??? 2、只寫一半:
    ?
    ??? 假設(shè)在匹配時不想進(jìn)行操作,則:
    ?

    ??? merge into t1_b

    ??? using t1_a

    ??? on (t1_b.name = t1_a.name)

    ??? --when matched then

    ??? --? update set t1_b.id = t1_b.id

    ??? when not matched then

    ???? ? insert values (t1_a.id, t1_a.name);

    ?
    ??? 如果使用9i版本,此時報錯:ORA-00905: missing keyword
    ??? 如果使用10g,則順利執(zhí)行。
    ?
    ?
    ??? 3、多值報錯:
    ?

    ??? truncate table t1_a;

    ??? truncate table t1_b;

    ??? insert into t1_a values ( 1 , 'a' );

    ??? insert into t1_b values ( 1 , 'c' );

    ??? insert into t1_b values ( 1 , 'b' );

    ??? commit ;

    ??? select * from t1_a;

    ??? select * from t1_b;

    ?

    ??? merge into t1_a

    ??? using t1_b

    ??? on (t1_b.id = t1_a.id)

    ??? when matched then

    ???? ? update set t1_a.name = t1_b.name

    ??? when not matched then

    ???? ? insert values (t1_b.id, t1_b.name);

    ???? ?

    ??? --ORA-30926: unable to get a stable set of rows in the source tables

    ?

    ?

    ??? 4、不能修改作為關(guān)聯(lián)的列

    ?

    ??? truncate table t1_a;

    ??? truncate table t1_b;

    ??? insert into t1_a values ( 1 , 'a' );

    ??? insert into t1_b values ( 1 , 'b' );

    ??? commit ;

    ?

    ??? merge into t1_a

    ??? using t1_b

    ??? on (t1_b.id = t1_a.id)

    ??? when matched then

    ???? ? update set t1_a.id = t1_b.id

    ??? when not matched then

    ???? ? insert values (t1_b.id, t1_b.name);

    ??? --ORA-00904: "T1_A"."ID": invalid identifier

    ?

    ?

    ?





    -The End-

    posted on 2008-10-23 16:51 decode360-3 閱讀(2624) 評論(0)  編輯  收藏 所屬分類: SQL Dev
    主站蜘蛛池模板: 国产免费播放一区二区| 日产国产精品亚洲系列| 特级做A爰片毛片免费看无码| 2020久久精品亚洲热综合一本| 亚洲高清国产拍精品26U| 亚洲JIZZJIZZ中国少妇中文| 性做久久久久久免费观看| 中文字幕成人免费视频| 大地资源中文在线观看免费版 | 丁香花在线观看免费观看图片| 亚洲精品无码久久久久A片苍井空 亚洲精品无码久久久久YW | 日韩在线免费看网站| jjizz全部免费看片| 久久国产精品2020免费m3u8 | 亚洲v高清理论电影| 国产午夜亚洲精品理论片不卡| 日韩精品视频免费网址| 四虎成人免费网址在线| 拍拍拍又黄又爽无挡视频免费| 国产精品怡红院永久免费| 亚洲免费人成视频观看| 日本一卡精品视频免费 | 久久久久亚洲AV无码麻豆| 亚洲AV成人一区二区三区AV| 亚洲精品成人片在线观看精品字幕| 亚洲精品网站在线观看不卡无广告 | 日韩一卡2卡3卡4卡新区亚洲| 亚洲精品无码专区2| 亚洲国产成人精品无码久久久久久综合| 精品无码国产污污污免费| 免费观看的毛片手机视频| 免费观看a级毛片| 国产老女人精品免费视频| 国产免费av一区二区三区| 无码专区一va亚洲v专区在线| 亚洲成a人片在线观看国产| 国产亚洲精品无码专区| 亚洲精品无码久久一线| 亚洲国产人成网站在线电影动漫| 婷婷亚洲久悠悠色悠在线播放| 久久久无码精品亚洲日韩京东传媒|