merge更新或插入同一張表,merge更新張表

來源:互聯網
上載者:User

merge更新或插入同一張表,merge更新張表
一段商務邏輯,需要先判斷一條記錄在資料庫中是否有存在,若存在則更新該記錄,若不存在則插入記錄。
應用之前的做法是:
1、先用條件判斷記錄在資料庫中的個數。
2.1、若count(*)>0,則執行UPDATE操作。
2.2、若count(*)=0,則執行INSERT操作。

1、先插入記錄。
2.1、若報ORA-001主鍵錯誤,則存在記錄,此時執行UPDATE操作。
2.2、若無報錯,認為插入完成。

以上兩種方法,我認為都可以實現這種商務邏輯,區別在於第二種方法可能只需要一次SQL操作,前提是大部分記錄都不存在,如果大部分操作都是UPDATE操作,可以這麼改:
1、先更新。
2.1、若更新條數>0,則存在記錄,執行完成。
2.2、若更新條數=0,則不存在記錄,執行INSERT操作。

以上邏輯最差的情況就是需要執行兩次SQL,如果資料量不大,則可以忽略消耗時間,但如果是大表,可能消耗就會翻倍。針對這種情況,或許可以考慮使用merge。一般使用merge都是用來將一個表資料匯入另一個表,但他可以對同一個表操作,例如:
需求:RULE_COLLISION表:根據app_name、rule_id和start_time更新collision_count欄位,或直接插入一條新的記錄。
SQL:
merge into RULE_COLLISION t1
using (SELECT 'TEST' app_name, 'TIMELIMIT_COMPONENT' MODULE, '規則一' RULE_ID, 3 COLLISION_COUNT, to_date('2014-07-21', 'yyyy-mm-dd') start_time from dual) t2
on (t1.app_name = t2.app_name AND t1.rule_id = t2.rule_id AND t1.start_time = t2.start_time)
when matched then
     update SET t1.collision_count = t2.collision_count
when not matched then
     insert values (t2.app_name, t2.MODULE, t2.RULE_ID, t2.COLLISION_COUNT, t2.start_time);


通過偽表dual,實現RULE_COLLISION表的自我更新或插入,這種做法和上面邏輯都是相同的,但這樣只會執行一次SQL,如下是執行計畫:

Execution Plan
----------------------------------------------------------
Plan hash value: 3989089639
-----------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                     | Rows  | Bytes | Cost (%CPU)| Time     |
-----------------------------------------------------------------------------------------------------------
|   0 | MERGE STATEMENT                |                          |     1 |   322 |     2   (0)| 00:00:01 |
|   1 |  MERGE                         | RI_RULE_COLLISION_DETAIL |       |       |            |          |
|   2 |   VIEW                         |                          |       |       |            |          |
|   3 |    NESTED LOOPS OUTER          |                          |     1 |   224 |     2   (0)| 00:00:01 |
|   4 |     FAST DUAL                  |                          |     1 |       |     2   (0)| 00:00:01 |
|   5 |     TABLE ACCESS BY INDEX ROWID| RI_RULE_COLLISION_DETAIL |     1 |   224 |     0   (0)| 00:00:01 |
|*  6 |      INDEX UNIQUE SCAN         | RULE_COLLISION_ID        |     1 |       |     0   (0)| 00:00:01 |
-----------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   6 - access("T1"."APP_NAME"(+)='GALT' AND "T1"."RULE_ID"(+)='規則一' AND "T1"."START_TIME"(+)=TO_DATE(' 2014-07-21 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))

Note
-----
   - dynamic sampling used for this statement (level=2)

Statistics
----------------------------------------------------------
          0  recursive calls
          3  db block gets
          2  consistent gets
          0  physical reads
          0  redo size
        829  bytes sent via SQL*Net to client
       1315  bytes received via SQL*Net from client
          3  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
          1  rows processed

這裡用到的是NESTED LOOPS OUTER,不是HASH JOIN,如果是兩表操作是否就不同了?這塊後面還需要實驗研究下,有高手可以請教請教!
SQL 2008 同一張表 使用merge 在資料存在的時更新 不存在直接在該表中插入資料 代碼如下 可以更新

你這個 自己 merge 自己的
感覺上是 不可能執行到 " when not matched then " 那個分支啊.

when not matched then
意思是 當 源表有記錄, 而目標表 沒有記錄的情況下, 執行的操作.

自己 merge 自己的, 怎麼實現 源表有記錄, 而目標表沒有記錄 ?
 
oracle的資料庫中怎將一張表中資料插入另一張表,兩張表都存在

假如 源表有資料, 目標表無資料。
INSERT INTO 目標表 SELECT * FROM 源表。

假如 源表 目標表都有資料, 要求 目標表 如果有資料則更新,沒有則插入。
MERGE INTO 目標表
USING 源表
ON ( 關聯條件 )
WHEN MATCHED THEN UPDATE SET 目標表.欄位 = 源表.欄位 -- 匹配的時候,更新
WHEN NOT MATCHED THEN INSERT VALUES(源表.欄位列表) -- 源表有,目標表沒有,插入
參考資料:hi.baidu.com/...6.html
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.