sql merge into

hao826231023發表於2018-09-13

連表更新操作:merge into

1、UPDATE或INSERT

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

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

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

 

1。根據B表查詢結果表C 更新表A 當year相等的時候,如果A表沒有則插入C表的內容

MERGE INTO A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON (A.id=C.AID)

WHEN MATCHED THEN

UPDATE SET A.YEAR=C.YEAR

WHEN NOT MATCHED THEN

INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);

commit;

 

2.只進行update操作,利用表B查詢結果C去更新表A 的資料

merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)

WHEN MATCHED THEN

UPDATE SET A.YEAR=C.YEAR;

 

3.利用表B的查詢資料表C對A表進行插入操作,

merge into A_MERGE A USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C ON(A.ID=C.AID)

WHEN NOT MATCHED THEN

insert(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);

 

4.利用表B查詢的資料表C對錶A進行更新的新增操作,在更新和新增的時候對on篩選的記錄再做一次條件判斷,控制哪些需要更新,哪些需要插入。

merge into A_MERGE A USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C

ON(A.id=C.AID)

when matched then

update SET A.name=C.name where C.city != '江西'

when not matched then

insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city='江西';

 

 

5.無條件的insert

有時候我們需要將一張表中所有的資料插入到另一張表,此時就可以新增常量過濾來實現,讓其只滿足匹配和不匹配,這樣就只有update或者只有insert,這裡我們要無條件全插入,則只需將on中的條件設定為永假。

merge into C_MERGE C USING (select B.AID,B.NAME,B.City from B_MERGE B) C ON (1=0)

when not matched then

insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);

 

6.帶delete 的update

MERGE提供了在執行資料操作時清除行的選項. 你能夠在WHEN MATCHED THEN UPDATE子句中包含DELETE子句. 

DELETE子句必須有一個WHERE條件來刪除匹配某些條件的行.匹配DELETE WHERE條件但不匹配ON條件的行不會被從表中刪除.

但我覺得這個帶where條件的update差不多,都是控制update,完全可以用帶where條件的update來實現。

 

 

 

 

 

 

 

 

相關文章