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...