Merge 語句的使用

2021-09-01 05:04:15 字數 2647 閱讀 4885

db2 merge 語句的作用非常強大,它可以將乙個表中的資料合併到另乙個表中,在合併的同時可以進行插入、刪除、更新等操作。我們還是先來看個簡單的例子吧,假設你定義了乙個雇員表(employe),乙個經理表(manager),如下所示:

---雇員表(employe)

create table employe (

employeid integer not null,---員工號

name varchar(20) not null,---姓名

salary double---薪水

); insert into employe (employeid,name,salary) values

(1,'張三',1000),

(2,'李四',2000),

(3,'王五',3000),

(4,'趙六',4000),

(5,'高七',5000);

--經理表(manager)

create table manager (

employeid integer not null,---經理號

name varchar(20) not null,---姓名

salary double---薪水

); insert into manager (managerid,name,salary) values

(3,'王五',5000),

(4,'趙六',6000);

經過一段時間,你發現這樣的資料模型,或者說表結構設計簡直就是一大敗筆,經理和雇員都是員工嘛,為什麼要設計兩個表呢?發現錯誤後就需要改正,所以你決定,刪除經理表(manager)表,將manager 表中的資料合併到employe 表中,仔細分析發現,王五在兩個表中都存在(可能是幹的好公升官了),而劉八在employe 表中並不存在,現在,我們要求把employe 表中不存在的manager都插入到employe 表中,存在的更新薪水。該怎麼辦呢?這個問題並不難,通常,我們可以分兩步,如下所示:

--更新存在的

update employe as em set salary=(select salary from manager where managerid=em.employeid)

where employeid in (

select managerid from manager

); ---插入不存在的

insert into employe (employeid,name,salary)

select managerid,name,salary from manager where managerid not in (

select employeid from employe

); 上面的處理是可以的,但是我們還可以有更簡單的方法,就是用merge語句,如下所示:

merge into employe as em

using manager as ma

on em.employeid=ma.managerid

when matched then update set em.salary=ma.salary

when not matched then insert values (ma.managerid,ma.name,ma.salary);

在上面的處理中,我們用經理表(manager)的薪水更新了雇員表(employe)的薪水,假設現在要求,如果經理表(manager)的薪水》雇員表(employe)的薪水的時候更新,否則不更新,怎麼辦呢?如下:

merge into employe as em

using manager as ma

on em.employeid=ma.managerid

when matched and em.salaryma.salary的資料,如果有,說明有問題,你想拋個異常,怎麼辦?如下:

merge into employe as em

using manager as ma

on em.employeid=ma.managerid

when matched and em.salaryma.salary then signal sqlstate '70001' set message_text = 'em.salary>ma.salary'

when not matched then insert values (ma.managerid,ma.name,ma.salary)

else ignore;

對於em.salary>ma.salary的情況,如果你不想拋異常,而是刪除employe中的資料,怎麼辦?如下:

merge into employe as em

using manager as ma

on em.employeid=ma.managerid

when matched and em.salaryma.salary then delete

when not matched then insert values (ma.managerid,ma.name,ma.salary)

else ignore;

以上簡單介紹了merge語句的使用,它的應用不只是上面介紹的情況,其實它可以應用在很多其他語句不好處理情況,這需要你去發現,記住熟能生巧。

**:[url]

MERGE語句的使用!

今天需要更新乙個表的標識,需要和另外乙個表關聯,但是update無法做到這點。a表中有乙個memo,b表中有乙個欄位存了幾個string,當b表中的任何乙個string為a表中的memo的子串時,更新a表中flag。update如下 update passap.tb finpay vth check...

MERGE語句的使用 複製表

今天需要更新乙個表的標識,需要和另外乙個表關聯,但是update無法做到這點。a表中有乙個memo,b表中有乙個欄位存了幾個string,當b表中的任何乙個string為a表中的memo的子串時,更新a表中flag。update如下 update passap.tb finpay vth check...

MERGE語句的使用 複製表

今天需要更新乙個表的標識,需要和另外乙個表關聯,但是update無法做到這點。a表中有乙個memo,b表中有乙個欄位存了幾個string,當b表中的任何乙個string為a表中的memo的子串時,更新a表中flag。update如下 update passap.tb finpay vth check...