1. 程式人生 > >oracle中merge into用法

oracle中merge into用法

merge into的形式:

[sql]  view plain  copy
  1. MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)  
  2. WHEN MATCHED THEN  
  3.     [UPDATE sql]  
  4. WHEN NOT MATCHED THEN  
  5.     [INSERT sql]  
作用:判斷B表和A表是否滿足ON中條件,如果滿足則用B表去更新A表,如果不滿足,則將B表資料插入A表但是有很多可選項,如下:
1.正常模式

2.只update或者只insert

3.帶條件的update或帶條件的insert

4.全插入insert實現

5.帶delete的update(覺得可以用3來實現)
下面一一測試。

測試建以下表:

[sql]  view plain  copy
  1. create table A_MERGE  
  2. (  
  3.   id   NUMBER not
     null,  
  4.   name VARCHAR2(12) not null,  
  5.   year NUMBER  
  6. );  
  7. create table B_MERGE  
  8. (  
  9.   id   NUMBER not null,  
  10.   aid  NUMBER not null,  
  11.   name VARCHAR2(12) not null,  
  12.   year NUMBER,  
  13.   city VARCHAR2(12)  
  14. );  
  15. create table C_MERGE  
  16. (  
  17.   id   NUMBER not null,  
  18.   name VARCHAR2(12) not null,  
  19.   city VARCHAR2(12) not null  
  20. );  
  21. commit;  
其表結構截圖如下圖所示:

A_MERGE表結構:


B_MERGE表結構


C_MERGE表結構


1.正常模式

先向A_MERGE和B_MERGE插入測試資料:

[sql]  view plain  copy
  1. insert into A_MERGE values(1,'liuwei',20);  
  2. insert into A_MERGE values(2,'zhangbin',21);  
  3. insert into A_MERGE values(3,'fuguo',20);  
  4. commit;  
  5.   
  6. insert into B_MERGE values(1,2,'zhangbin',30,'吉林');  
  7. insert into B_MERGE values(2,4,'yihe',33,'黑龍江');  
  8. insert into B_MERGE values(3,3,'fuguo',,'山東');  
  9. commit;  

此時A_MERGE和B_MERGE表中資料截圖如下:

A_MERGE表資料:


B_MERGE表資料:


然後再使用merge into用B_MERGE來更新A_MERGE中的資料:

[sql]  view plain  copy
  1. MERGE INTO A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON (A.id=C.AID)  
  2. WHEN MATCHED THEN  
  3.   UPDATE SET A.YEAR=C.YEAR   
  4. WHEN NOT MATCHED THEN  
  5.   INSERT(A.ID,A.NAME,A.YEARVALUES(C.AID,C.NAME,C.YEAR);  
  6. commit;  
此時A_MERGE中的表資料截圖如下:


2.只update模式
首先向B_MERGE中插入兩個資料,來為了體現出只update沒有insert,必須有一個數據是A中已經存在的

另一個數據時A中不存在的,插入資料語句如下:

[sql]  view plain  copy
  1. insert into B_MERGE values(4,1,'liuwei',80,'江西');  
  2. insert into B_MERGE values(5,5,'tiantian',23,'河南');  
  3. commit;  
此時A_MERGE和B_MERGE表資料截圖如下:
A_MERGE表資料截圖:


B_MERGE表資料截圖:


然後再次用B_MERGE來更新A_MERGE,但是僅僅update,沒有寫insert部分。

[sql]  view plain  copy
  1. merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)  
  2. WHEN MATCHED THEN  
  3.   UPDATE SET A.YEAR=C.YEAR;  
  4.     
  5. commit;  
merge完之後A_MERGE表資料截圖如下:可以發現僅僅更新了AID=1的年齡,沒有插入AID=4的資料


3.只insert模式
首先改變B_MERGE中的一個數據,因為上次測試update時新增的資料沒有插入到A_MERGE,這次可以用。

[sql]  view plain  copy
  1. update B_MERGE set year=70 where AID=2;  
  2. commit;  
此時A_MERGE和B_MERGE的表資料截圖如下:
A_MERGE表資料:


B_MERGE表資料:


然後用B_MERGE來更新A_MERGE中的資料,此時只寫了insert,沒有寫update:

[sql]  view plain  copy
  1. merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)  
  2. WHEN NOT MATCHED THEN  
  3.     insert(A.ID,A.NAME,A.YEARVALUES(C.AID,C.NAME,C.YEAR);  
  4. commit;  
此時A_MERGE的表資料截圖如下:



4.帶where條件的insert和update。
我們在on中進行完條件匹配之後,還可以在後面的insert和update中對on篩選出來的記錄再做一次條件判斷,用來控制哪些要更新,哪些要插入。
測試資料的sql程式碼如下,我們在B_MERGE修改了兩個人名,並且增加了兩個人員資訊,但是他們來自的省份不同,
所以我們可以通過新增省份條件來控制哪些能修改,哪些能插入:

[sql]  view plain  copy
  1. update B_MERGE set name='yihe++' where id=2;  
  2. update B_MERGE set name='liuwei++' where id=4;  
  3. insert into B_MERGE values(6,6,'ningqin',23,'江西');  
  4. insert into B_MERGE values(7,7,'bing',24,'吉安');  
  5. commit;  
A_MGERGE表資料截圖如下:


B_MERGE表資料:


然後再用B_MERGE去更新A_MERGE,但是分別在insert和update後面添加了條件限制,控制資料的更新和插入:

[sql]  view plain  copy
  1. merge into A_MERGE A USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C   
  2. ON(A.id=C.AID)   
  3. when matched then  
  4.   update SET A.name=C.name where C.city != '江西'  
  5. when not matched then  
  6.   insert(A.ID,A.name,A.yearvalues(c.AID,C.name,C.yearwhere C.city='江西';  
  7. commit;  


此時A_MERGE截圖如下:



5.無條件的insert。
有時我們需要將一張表中所有的資料插入到另外一張表,此時就可以新增常量過濾謂詞來實現,讓其只滿足
匹配和不匹配,這樣就只有update或者只有insert。這裡我們要無條件全插入,則只需將on中條件設定為永假
即可。用B_MERGE來更新C_MERGE程式碼如下:

[sql]  view plain  copy
  1. merge into C_MERGE C USING (select B.AID,B.NAME,B.City from B_MERGE B) C ON (1=0)  
  2. when not matched then  
  3. 相關推薦

    OracleMerge into用法總結 (轉載)

    字符 存在 sin 刪除 ron mic 但是 多個 前段時間 Oracle中Merge into用法總結 (出處:http://www.cnblogs.com/dongsheng/p/4384754.html) 起因:   前段時間,因為涉及到一張表的大數據操作,要同時

    oraclemerge into用法

    merge into的形式: [sql]  view plain  copy MERG

    oraclemerge into用法解析

    merge into的形式: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...) WHEN MATCHED THEN [UPDAT

    oracle merge into用法

    大數據 char 條件 http -1 alt mat 一個表 dml語句 很多時候我們需要通過篩選條件同時對表進行 更新,插入,刪除 等操作。這樣如果我們單一的去操作表會顯得很麻煩,下面會說到這個merge into 的用法會極大的優化我們操作表的時間和代碼量。 舉例,

    ORACLE merge....into用法簡單瞭解一下

    MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and […]…) WHEN MATCHED THEN [UPDATE sql] WHEN NO

    oraclemerge into..using..on..when..when..用法

    語法:MERGE INTO [your table-name] [rename your table here] USING ( [write your query here] )[rename your query-sql and using just like a ta

    oraclemerge into的使用

    rollback 裏的 get express pre sql語句 可選 需求 目標 Oracle在9i引入了merge命令, 通過這個merge你能夠在一個SQL語句中對一個表同時執行inserts和updates操作. 當然是update還是insert是依據於你的指定

    OracleMerge into用法總結

    簡單的說就是,判斷表中有沒有符合on()條件中的資料,有了就更新資料,沒有就插入資料。   有一個表T,有兩個欄位a、b,我們想在表T中做Insert/Update,如果條件滿足,則更新T中b的值,否則在T中插入一條記錄。在Microsoft的SQL語法中,很簡單的一句判斷就可以了,SQL Se

    oraclemerge into用法解析

    實現 過濾 using 相關 table 我們 where delet int oracle中的merge into用法解析merge into的形式  MERGE INTO [target-table] A USING [source-table sql] B ON([c

    Oracle MERGE語句的用法(轉載)

    同時 sdn ble reat nth merge type href detail 原文章出處(http://blog.csdn.net/lichkui/article/details/4306299) MERGE語句是Oracle9i新增的語法,用來合並UPDATE和I

    PLSQL Merge into和Update的用法

    這兩天一直在處理關於SQL server儲存過程轉換到Oracle中,也發現一些oracle語句的區別。     在oracle 中有個語法:merge    用法如下: merge into 表1   using 表2 或者(select*from 表2)別名

    oracle merge into 用法

    MERGE INTO 是Oracle 9i以後才出現的新的功能。那這個功能 是什麼呢?   簡單來說,就是:“有則更新(update),無則插入(insert)”;   從這句話裡,應該可以理解到,merge into 操作一個物件'A'的時候,要有另外一個結果集做為源資料 'B'.   ‘merge int

    oracle一張表向另一張表插入不重複資料merge into用法

    參考1: 由於專案中需要用到批量插入,為了防止使用者插入重複的資料,需要先判斷插入的資料是不是已經存在,如果存在則忽略這次插入,否則插入這條資料,剛開始的時候是先用一條SQL語句判斷,如果返回結果是真(記錄已經存在),則忽略,否則插入這條資料,這樣的話插入一條資料

    sql語句EXISTS的用法oraclesubstr的用法

    參數 ... ble 索引 效率 put www 長度 重復記錄 轉需:EXISTS 指定一個子查詢,檢測 行 的存在。語法: EXISTS subquery參數: subquery 是一個受限的 SELECT 語句 (不允許有 COMPUTE 子句和 INTO 關鍵字)。

    【基礎】ORACLEsubstr的用法

    itl .cn 字符串 ref art from 基礎 htm bst ORACLE中substr函數的簡單用法 substr(字符串,截取開始位置,截取長度) //返回截取的字 substr(‘Hello World‘,0,1) //返回結果為 ‘H‘ *從字符串第一

    ORACLE TRANSLATE的用法

    spa sele select abcde ora 保留 用法 ans class --TRANSLATE(string,from_str,to_str) --to_str和from_str中的字符一一對應 --如果string裏有,from_str字符集裏沒有的字符,

    Oraclewith as用法

    分組 關鍵字 視圖 group 高效 這也 過程 avi 臨時 with as 相當於虛擬視圖。 例子:需求描述 按照x列分組後統計y列的總值,最終目標是選出比y列總值的三分之一大的那些分組統計信息 使用子查詢方式實現最容易想到的方法 SELECT x, SUM (y)

    pandasmerge用法

    使用過sql語言的話,一定對join,left join, right join等非常熟悉,在pandas中,merge的作用也非常類似。直接上例子: import numpy as np import pandas as pd from pandas import Series,

    Merge into用法總結

    從備份表中更新欄位到正式表中,使用 UPDATE 批量更新大量的資料,會出現效率低下,有時候甚至卡死的情況,後面通過使用 MERGE INTO 代替 UPDATE 執行批量更新,會提升執行效率。 MERGE INTO語法如下: MERGE INTO table_name alias1&nbs

    oracleto_date詳細用法示例(oracle日期格式轉換)

    1. 日期和字元轉換函式用法(to_date,to_char) select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') as nowTime from dual;   //日期轉化為字串  select to_char(sysd