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

    1、 簡(jiǎn)單舉例:
    ?

    ??? 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è)在匹配時(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版本,此時(shí)報(bào)錯(cuò):ORA-00905: missing keyword
    ??? 如果使用10g,則順利執(zhí)行。
    ?
    ?
    3、多值報(bào)錯(cuò):
    ?

    ??? 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

    ?

    ?

    ?

    posted on 2008-10-23 19:51 decode360 閱讀(191) 評(píng)論(0)  編輯  收藏 所屬分類: 05.SQL
    主站蜘蛛池模板: **aaaaa毛片免费| 亚洲国产精品yw在线观看| 中文字幕影片免费在线观看| 一本一道dvd在线观看免费视频| 亚洲成人网在线观看| 久久精品国产亚洲麻豆| 亚洲Aⅴ无码一区二区二三区软件| 曰曰鲁夜夜免费播放视频| 男人进去女人爽免费视频国产| 精品亚洲成A人在线观看青青| 久久国产亚洲精品| 亚洲性无码av在线| 亚洲图片中文字幕| 亚洲国产美女在线观看| 久久亚洲美女精品国产精品| 亚洲va久久久噜噜噜久久狠狠| 亚洲欧洲自拍拍偷午夜色无码| 亚洲日本中文字幕一区二区三区| 四虎影在线永久免费观看| 日韩a级毛片免费视频| 暖暖日本免费在线视频 | 日本在线高清免费爱做网站| 97av免费视频| 91精品国产免费久久久久久青草| 最近中文字幕大全中文字幕免费| 91精品免费高清在线| 青青草a免费线观a| 四虎成人精品一区二区免费网站| 大地资源免费更新在线播放| 日韩免费一级毛片| ZZIJZZIJ亚洲日本少妇JIZJIZ| 在线观看国产区亚洲一区成人| 国产亚洲精久久久久久无码| 亚洲色图在线观看| 亚洲一区AV无码少妇电影| 最新亚洲人成无码网www电影| 国产精品免费在线播放| 香港a毛片免费观看| 成人免费网站在线观看| 亚洲日韩VA无码中文字幕 | 亚洲黄色片在线观看|