1. 程式人生 > >oracle一張表向另一張表插入不重複資料merge into用法

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


參考1:

由於專案中需要用到批量插入,為了防止使用者插入重複的資料,需要先判斷插入的資料是不是已經存在,如果存在則忽略這次插入,否則插入這條資料,剛開始的時候是先用一條SQL語句判斷,如果返回結果是真(記錄已經存在),則忽略,否則插入這條資料,這樣的話插入一條資料就要發起兩個到資料庫的連線,後來發現這樣做效率實在太低了,Google了一下,發現oracle資料庫支援merge語句,做了個測試,成功了,記錄下來供本人及同行以後查閱之用。

資料庫:TEST

1 2 3 4 5 CREATE TABLE TEST( ID      NUMBER NOT NULL
, NAME    VARCHAR2(30)NOT NULL, SEX     VARCHAR2(2) DEFAULT '男' )
插入兩條資料:
1 2 INSERT INTO TESTVALUES(1,'SUNZHENXING','男') INSERT INTO TESTVALUES(2,'SUNHAILONG','女')
MERGE語句:
1 2 3 4 5 6 MERGEINTO TEST A USING TEST B ON (A.NAME=B.NAME) WHEN MATCHEDTHEN UPDATE
 SET A.SEX='女'WHERE A.NAME='SUNZHENXING' WHEN NOT MATCHEDTHEN INSERT VALUES (3,'SUNZHENXING','女')

參考2:

  1. 可省略的update 或者insert
  2.    MERGE INTO products p   
  3.     2 USING newproducts np   
  4.     3 ON (p.product_id = np.product_id)   
  5.     4 WHEN MATCHED THEN
  6.     5 UPDATE
  7.     6 SET p.product_name = np.product_name,   
  8.     7 p.category = np.category;

  使用表newproducts中的product_name 和category欄位來更新表products 中相同product_id的product_name 和category.

2,當條件不滿足的時候把newproducts表中的資料INSERT 到表products中。

  1. MERGE INTO products p   
  2.     USING newproducts np   
  3. ON (p.product_id = np.product_id)   
  4. WHENNOT MATCHED THEN
  5. INSERT
  6. VALUES (np.product_id, np.product_name,   
  7.      np.category);   

3,帶條件的insert 和update

  1. MERGE INTO products p   
  2.  USING newproducts np   
  3. ON (p.product_id = np.product_id)   
  4. WHEN MATCHED THEN
  5. UPDATE
  6. SET p.product_name = np.product_name   
  7. WHERE p.category = np.category;

 insert 和update 都帶有where 字句

  1. MERGE INTO products p   
  2.  USING newproducts np   
  3. ON (p.product_id = np.product_id)   
  4. WHEN MATCHED THEN
  5. UPDATE
  6. SET p.product_name = np.product_name,   
  7.      p.category = np.category   
  8. WHERE p.category = 'DVD'
  9. WHENNOT MATCHED THEN
  10. INSERT
  11. VALUES (np.product_id, np.product_name, np.category)   
  12. WHERE np.category != 'BOOKS'  

4,無條件的insert

  1. MERGE INTO products p   
  2.  USING newproducts np   
  3. ON (1=0)   
  4. WHENNOT MATCHED THEN
  5. INSERT
  6. VALUES (np.product_id, np.product_name, np.category)   
  7. WHERE np.category = 'BOOKS'

ps:

1、My table has four cols:ID,MyDataTime,TagName,Value.Excep ID,other three cols should be added"" when be quoted.

2、My code:

MERGE INTO ZTT."AllDataTable221_0" A --目標表
USING ZTT."AllDataTable221" B --源表
ON (A."MyDateTime" = B."MyDateTime")  --條件--原來用mydatetime作為條件,發現不能二次插入,必須用主鍵ID作為判斷條件
WHEN NOT MATCHED THEN  --not matched 與insert一起用,match與update一起用
INSERT (A.ID,A."MyDateTime",A."TagName",A."Value") VALUES(B.ID,B."MyDateTime",B."TagName",B."Value") WHERE B."TagName" = '30MAD12CY122|XQ01';
merge into中on的判斷條件,應該已主鍵判斷,因為只有主鍵才有唯一性,用其他條件判斷可能會出錯
-- Oracle資料庫 
-- SQL說明 : 將source_tb中的資料merge到target_tb表中 
-- source_tb中存在同target_tb主鍵相同的記錄時,更新target_tb表 
-- source_tb不存在同target_tb主鍵相同的記錄時,插入target_tb表 
-- SQL正文 : 
merge into target_tb t using source_tb s 
on (t.pk = s.pk) --執行條件 
when matched then --如果資料存在,更新資料 
update set t.name = s.name,t.address = s.address 
when not matched then --如果資料不存在,插入資料 
insert (t.name,t.address) values (s.name,s.address)