看板 Database 關於我們 聯絡資訊
資料庫名稱:oracle 資料庫版本:11g 內容/問題描述: 各位好,小弟目前是寫JAVA的工程師。 最近遇到的問題是,如果資料庫有資料就UPDATE,否則就INSERT。 在MySQL上可以用ON DUPLICATE,但Oracle無這個語法。 後來有查詢到MERGE INTO的語法。 我的語法大概是如下 MERGE INTO TABLE_A TA USING ( SELECT '值A' AS X,'值B' AS Y FROM DUAL) TB ON(TA.X=TB.X) WHEN MATCHED UPDEATE... WHEN NOT MATCHED THEN INSERT... 但公司的DBA說MERGE INTO是資料倉儲(?)用,不是給我這樣用的。 所以現在的解法是先SELECT回JAVA後,再判斷要更新還是插入。 但這樣不就要2次IO嗎?如果我現在要處理10筆資料,不就要10*2=20次IO? 想請問是否有其他寫法呢?(有另外查到用EXCEPTION的方式,但preparestatment似乎 不能加上分號(;)?這我會再試試看。) 謝謝~~ --------------------- 10/26更新 謝謝各位的回應!也謝謝私底下那位C大提出的看法與提點,惠我良多。 首先是MERGE,因為這語法並不是每個資料庫都通用,所以有時候不使用可能是為了 轉換資料庫後,不易察覺、維護。(我當時確實沒想到這點) 這邊提供一下C大的提點寫法: update table_A set ... where (table_A inner join table_b) ref:http://www.geeksengine.com/article/oracle-cross-table-update.html 可以參考一下第三點的寫法。 插入則是 insert into table_A (select ... table_A left join table_B) --------------------- 我原本的想法是先SELECT出來到JAVA,然後產兩個SET,一個存要更新的,一個存 要插入的;本來還想測使用MERGE與先SELECT資料再判斷要更新還是插入(2次IO)的耗時, 但因為USER突然又增減一堆功能...這可能要等之後再測了。 在此再次謝謝各位~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.224.209.206 ※ 文章網址: https://www.ptt.cc/bbs/Database/M.1477216311.A.5CB.html
a926: MERGE INTO沒有限定情境吧=_= 即使是SQL Server 10/23 19:17
a926: 上面的說明也沒有說適用在DW阿 10/23 19:17
a926: https://goo.gl/Tf2952 請他貼官方說明出來比較準 10/23 19:18
SeanBoog: 不太懂dw跟merge into的關係 10/24 20:19
ray2501: 我沒試過 不過看看 START WITH ... CONNECT BY clause 10/25 23:33
ray2501: 啊,不對 忽略我的話,那是另外一個東西 10/25 23:34
ray2501: 看起來 upsert 是用 MERGE 啊 10/25 23:37
ray2501: http://tinyurl.com/jn45p69 10/25 23:39
※ 編輯: j16598231 (61.230.92.65), 10/26/2016 22:38:23