首頁 > 資料庫 > Oracle > 主體

oracle中merge into的用法是什麼

WBOY
發布: 2022-03-02 13:47:24
原創
22764 人瀏覽過

在oracle中,「merge into」用於更新表中的數據,可以將一個表中的數據插入另一個表中,若被插入的表中已經有該數據則更新該數據,若沒有該資料則會在插入的表中新增資料。

oracle中merge into的用法是什麼

本教學操作環境:Windows10系統、Oracle 11g版、Dell G3電腦。

oracle中merge into的用法是什麼

Oracle9g引入了MERGE命令,你能夠在一個SQL語句中對一個表同時執行inserts和update操作. MERGE命令從一個或多個資料來源中選擇行來update或insert到一個或多個表.在Oracle 10g中MERGE有以下一些改進:

#1、UPDATE或INSERT子句是可選的

#2 、UPDATE和INSERT子句可以加WHERE子句

3、在ON條件中使用常數過濾謂詞來insert所有的行到目標表中,不需要連接來源表和目標表

#4、UPDATE子句後面可以跟DELETE子句來移除一些不需要的行

5、來源表就是using關鍵字後面接的表,目標表就是要被merge into的表

6、merge into 中所有的update、insert、delete都是針對目標表來操作的。由於merge into已經制定了操作的表,所以update、insert、delete都不需要再顯示指出表名

7、總之,merge into的作用就是解決用B表跟新A表數據,如果A表中沒有,則把B表的數據插入A表或向一個表中插入數據,如果該表已有該數據則更新,反之新增數據。
語法:

MERGE INTO [your table-name] [rename your table here]  
  USING ( [write your query here] )[rename your query-sql and using just like a table]  
  ON ([conditional expression here] AND [...]...)  
  WHEN MATHED THEN [here you can execute some update sql or something else ]  
  WHEN NOT MATHED THEN [execute something else here ! ]
登入後複製

接下來我們來直接進行測試:

需求一:向一個表中插入一條數據,如果該表中已經有該數據則更新,反之新增

先建立一個表TEST_ONE

create table TEST_ONE(
  ID   NUMBER not null
    primary key,
  NAME VARCHAR2(255),
  IP   VARCHAR2(255),
  MEMO VARCHAR2(255))commit;
登入後複製

隨便加入幾個資料作為測試資料

INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (1, '2', '3', '周文军');
INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (2, '66', '366', '2656');
INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (3, '5656', '626', '2626');
INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (4, '5656', '2626', '626');
登入後複製

好了,我們的資料表已經建成,如下圖:
oracle中merge into的用法是什麼
如果我們需要新增一條數據,一般會這樣進行

INSERT INTO TEST_ONE (ID, NAME, IP, MEMO) VALUES (5, 'mrhu', '127.0.0.1.0', '王先生的IP');
登入後複製

但我們希望可以先用ID進行判斷,沒有該數據新增,有該數據更新,怎麼實現呢?

那麼merge into指令來了,直接擼程式碼:

merge into TEST_ONE mtb using (select '5' as id, 'mrhu' as name,'127.0.0.1.0' as ip,'王先生的IP' as memo from dual)mmb on (mtb.id = mmb.id)when matched THENupdate set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo
when not matched theninsert (mtb.id, mtb.name,mtb.ip,mtb.memo) VALUES(mmb.id,mmb.name,mmb.ip,mmb.memo);
登入後複製

運行如下:
oracle中merge into的用法是什麼
我們再來看看表中資料:
oracle中merge into的用法是什麼
資料新增成功!

那我們要如何測試更新呢?很簡單,我們將memo='王先生的IP' 改為memo='本大美女的IP'來進行測試

merge into TEST_ONE mtb using (select '5' as id, 'mrhu' as name,'127.0.0.1.0' as ip,'本大美女的IP' as memo from dual)mmb on (mtb.id = mmb.id)when matched THENupdate set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo
when not matched theninsert (mtb.id, mtb.name,mtb.ip,mtb.memo) VALUES(mmb.id,mmb.name,mmb.ip,mmb.memo);
登入後複製

運行如下:
oracle中merge into的用法是什麼
我們再來看看表中資料:
oracle中merge into的用法是什麼
資料更新成功啦!

需求二:將A表中的資料加入B表中,要求透過主鍵來進行判斷,如果包含該資料則更新,反之新增

我們再建立一個表TEST_TWO作為表B,TEST_ONE作為表A

create table tes(
  ID   NUMBER not null
    primary key,
  CODE VARCHAR2(255),
  MEMO VARCHAR2(255));commit;
登入後複製

好了表TEST_TWO建立好了,我們先來新增一條資料吧!

INSERT INTO ROOT.TEST_TWO (ID, CODE, MEMO) VALUES (5, 'mrhu', '隔壁老王的IP');
登入後複製

我們再看看TEST_TWO中的資料:
oracle中merge into的用法是什麼
我們來將TEST_ONE中的資料導到我們新建的表中,透過分析,我們發現,TEST_TWO 表中有了一條數據,ID為5,TEST_ONE中也有一條ID為5的數據,預期執行效果為TEST_TWOID為5的數據的memo字段值將更新為TEST_ONE中的'本大美女的IP',其他值進行新增操作。

我們寫程式來驗證一下:

merge into TEST_TWO mtb using (select id,name,ip,memo from TEST_ONE) mmb on (mtb.id = mmb.id)when matched THENUPDATE set mtb.code = mmb.name,mtb.memo = mmb.memo
when not matched THENinsert (mtb.id,mtb.code,mtb.memo) values (mmb.id,mmb.name,mmb.memo);
登入後複製

我們來看看效果:
oracle中merge into的用法是什麼
執行結果與預期結果一致,好了,merge into的用法你們學會了嗎! 喜歡的關注支持一下!

推薦教學:《Oracle影片教學

以上是oracle中merge into的用法是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板