kxbin
          成功留給有準備的人
          posts - 10,  comments - 35,  trackbacks - 0

          動機:

          想在Oracle中用一條SQL語句直接進行Insert/Update的操作。

          說明:

          在進行SQL語句編寫時,我們經常會遇到大量的同時進行Insert/Update的語句 ,也就是說當存在記錄時,就更新(Update),不存在數據時,就插入(Insert)。

          實戰:

          接下來我們有一個任務,有一個表T,有兩個字段a,b,我們想在表T中做Insert/Update,如果存在,則更新T中b的值,如果不存在,則插入一條記錄。在Microsoft的SQL語法中,很簡單的一句判斷就可以了,SQL Server中的語法如下:

          if exists(select 1 from T where T.a=''1001'' ) update T set T.b=2 Where T.a=''1001'' else insert into T(a,b) values(''1001'',2);

          以上語句表明當T表中如果存在a=''1001'' 的記錄的話,就把b的值設為2,否則就Insert一條a=''100'',b=2的記錄到T中。

          但是接下來在Oracle中就遇到麻煩了,記得在Oracle 9i之后就有一條Merge into 的語句可以同時進行Insert 和Update的嗎,Merge的語法如下:

           

          Sql代碼  
          1. MERGE INTO table_name alias1    
          2. USING (table|view|sub_query) alias2   
          3. ON (join condition)    
          4. WHEN MATCHED THEN    
          5.     UPDATE table_name    
          6.     SET col1 = col_val1,    
          7.         col2     = col2_val    
          8. WHEN NOT MATCHED THEN    
          9.     INSERT (column_list) VALUES (column_values);   
          上面的語法大家應該都容易懂吧,那我們按照以上的邏輯再寫一次。
          Sql代碼  
          1. MERGE INTO T T1   
          2. USING (SELECT a,b FROM T WHERE t.a=''1001'') T2   
          3. ON ( T1.a=T2.a)   
          4. WHEN MATCHED THEN  
          5.   UPDATE SET T1.b = 2   
          6. WHEN NOT MATCHED THEN    
          7.   INSERT (a,b) VALUES(''1001'',2);  
          以上的語句貌似很對是吧,實際上,該語句只能進行更新,而無法進行Insert,錯誤在哪里呢?

          其實在Oracle中Merge語句原先是用來進行整表的更新用的,也就是ETL工具比較常用的語法,重點是在Using上。

          用中文來解釋Merge語法,就是:

          在alias2中Select出來的數據,每一條都跟alias1進行 ON (join condition)的比較,如果匹配,就進行更新的操作(Update),如果不匹配,就進行插入操作(Insert)。

          因此,嚴格意義上講,”在一個同時存在Insert和Update語法的Merge語句中,總共Insert/Update的記錄數,就是Using語句中alias2的記錄數。”

          以上這句話也就很好的解釋了在上面寫的語句為何只能進行Update,而不能進行Insert了,因為都Select不到數據,如何能進行Insert呢:)

          接下來要改成正確的語句就容易多了,如下:


          Sql代碼  
          1. MERGE INTO T T1   
          2. USING (SELECT ''1001'' AS a,2 AS b FROM dual) T2   
          3. ON ( T1.a=T2.a)   
          4. WHEN MATCHED THEN  
          5.   UPDATE SET T1.b = T2.b   
          6. WHEN NOT MATCHED THEN    
          7.   INSERT (a,b) VALUES(T2.a,T2.b);  
          查詢結果,OK!
          posted on 2011-10-05 17:27 kxbin 閱讀(4126) 評論(0)  編輯  收藏 所屬分類: ORACLE
          你恨一個人是因為你愛他;你喜歡一個人,是因為他身上有你沒有的;你討厭一個人是因為他身上有你有的東西;你經常在別人面前批評某人,其實潛意識中是想接近他。

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(5)

          隨筆檔案

          文章分類

          文章檔案

          相冊

          收藏夾

          J2EE

          java技術網站

          Linux

          平時常去的網站

          數據庫

          電影網站

          網站設計

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黔西县| 闽清县| 澜沧| 隆尧县| 清河县| 淅川县| 康保县| 凤山县| 明水县| 文山县| 怀柔区| 文成县| 永城市| 志丹县| 岳普湖县| 樟树市| 上思县| 阿坝| 莎车县| 旬邑县| 赤壁市| 平昌县| 丰都县| 化州市| 东明县| 鸡东县| 元江| 浦北县| 梨树县| 开平市| 洮南市| 盐边县| 靖安县| 绵竹市| 衢州市| 万安县| 宁乡县| 灵川县| 班玛县| 和林格尔县| 巴马|