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

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

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

    Decode360's Blog

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

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

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

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

    ??? 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,則順利執行。
    ?
    ?
    ??? 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、不能修改作為關聯的列

    ?

    ??? 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 閱讀(2632) 評論(0)  編輯  收藏 所屬分類: SQL Dev
    主站蜘蛛池模板: 国产AV无码专区亚洲AV漫画| 国产美女无遮挡免费视频网站 | 亚洲视频在线一区二区| 久久亚洲精品国产亚洲老地址| 亚洲免费二区三区| 久久亚洲AV无码精品色午夜| 久久青草免费91线频观看不卡 | 亚洲人精品亚洲人成在线| 国拍在线精品视频免费观看| 亚洲伊人久久精品| 福利免费观看午夜体检区| 亚洲一区二区三区免费视频| 亚洲免费网站观看视频| 亚洲精品中文字幕无码A片老| 永久免费视频v片www| 看Aⅴ免费毛片手机播放| 免费女人18毛片a级毛片视频| 一区二区免费在线观看| 亚洲女同成av人片在线观看 | 免费毛片在线看不用播放器| 亚洲av无码一区二区三区网站| 免费A级毛片无码A∨中文字幕下载| 91精品国产亚洲爽啪在线影院| 91精品国产免费久久久久久青草| 激情综合亚洲色婷婷五月| 精品久久久久久久免费加勒比| 黄色免费在线观看网址| 亚洲三区在线观看无套内射| 少妇人妻偷人精品免费视频| 国产成人精品日本亚洲专一区| 在线观看免费精品国产| 国产线视频精品免费观看视频| 亚洲国产精品久久久久婷婷老年| 无码乱肉视频免费大全合集| 亚洲av日韩精品久久久久久a| 亚洲综合色区在线观看| 国内精品免费麻豆网站91麻豆| 朝桐光亚洲专区在线中文字幕| 亚洲大成色www永久网站| 思思99re66在线精品免费观看| 免费无码专区毛片高潮喷水|