oracle一張表向另一張表插入不重複資料merge into用法
阿新 • • 發佈:2019-02-15
參考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 TEST VALUES (1, 'SUNZHENXING' , '男' )
INSERT INTO TEST VALUES (2, 'SUNHAILONG' , '女' )
|
1 2 3 4 5 6 |
MERGE INTO TEST
A USING TEST B
ON (A. NAME =B. NAME )
WHEN MATCHED THEN
UPDATE SET A.SEX= '女' WHERE A. NAME = 'SUNZHENXING'
WHEN NOT MATCHED THEN
INSERT VALUES (3, 'SUNZHENXING' , '女' )
|
參考2:
- 可省略的update 或者insert
- 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;
使用表newproducts中的product_name 和category欄位來更新表products 中相同product_id的product_name 和category.
2,當條件不滿足的時候把newproducts表中的資料INSERT 到表products中。
- MERGE INTO products p
- USING newproducts np
- ON (p.product_id = np.product_id)
- WHENNOT MATCHED THEN
- INSERT
- VALUES (np.product_id, np.product_name,
- np.category);
3,帶條件的insert 和update
- MERGE INTO products p
- USING newproducts np
- ON (p.product_id = np.product_id)
- WHEN MATCHED THEN
- UPDATE
- SET p.product_name = np.product_name
- WHERE p.category = np.category;
insert 和update 都帶有where 字句
- MERGE INTO products p
- USING newproducts np
- ON (p.product_id = np.product_id)
- WHEN MATCHED THEN
- UPDATE
- SET p.product_name = np.product_name,
- p.category = np.category
- WHERE p.category = 'DVD'
- WHENNOT MATCHED THEN
- INSERT
- VALUES (np.product_id, np.product_name, np.category)
- WHERE np.category != 'BOOKS'
4,無條件的insert
- MERGE INTO products p
- USING newproducts np
- ON (1=0)
- WHENNOT MATCHED THEN
- INSERT
- VALUES (np.product_id, np.product_name, np.category)
- 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)