oracle9i引入了merge命令,使我們能夠在乙個sql語句中對乙個表同時執行inserts和updates操作,merge命令從乙個或多個資料來源中選擇行來updating或inserting到乙個或多個表.最近工作中需要處理一批號碼資料.之前資料庫中有乙個號碼的黑名單,使用者資訊**的黑名單使用者過濾,**字段如下
black_dn( dn varchar(13),flag number(2))
此**中儲存了乙份號碼黑名單資料,dn為號碼,flag為地市標誌.現在又有了乙份黑名單.這份黑名單中可能有重複的,可能有之前已經匯入到黑名單**中的.需要把這份黑名單無重複的新增近black_dn表中於是我按照black_dn建立了乙個新的表
create balck_dn_new as select * from black_dn where 0=1;
然後將新的資料使用sqlload全部匯入到新的表中,接著我需要更新black_dn中的資料,於是使用了如下的sql
merge into blakc_dn b1
using black_dn_new b2
on (b1.dn=b2.dn and b1.flag=b2.flag)
when matched then
update set
b1.dn=b2.dn
b1.flag=b2.flag
when not matched then
insert values(b2.dn,b2.flag);
但是資料庫反饋了ora-00904: "b1"."dn": 無效的識別符號,剛開始非常想不通為什麼會提示這個錯誤.明明欄位是沒有錯誤的.於是乎又是找了一通資料,發現了問題所在,如果你在on後引用了哪些列,這些列是不允許更新的.但是oracle這個提示錯誤個人覺得是有問題的.為了正確使用,我又為把balck_dn表擴充套件為
black_dn (dn varchar(13),flag number(2),iflag number(2))
在iflag欄位中全部填入了0,然後修改了sql
merge into blakc_dn b1
using black_dn_new b2
on (b1.dn=b2.dn and b1.flag=b2.flag)
when matched then
update set
b1.iflag=10
when not matched then
insert values(b2.dn,b2.flag,1);
本以為ok了,結果oracle還是不幹,反饋錯誤ora-30926: 無法在源表中獲得一組穩定的行,這個地方balck_dn_new和black_dn出現了多對一的現象也是不允許的啊,為了正確使用merge,於是對balck_dn進行了排重工作
delete from balck_dn_new a
where a.rowid >
(select min(x.rowid) from balck_dn_new b where b.a = a.a);
接著用上面的merger的sql語句,成功處理,目的達到了.
1、update或insert子句是可選的
2、update和insert子句可以加where子句
3、on條件中使用常量過濾謂詞來insert所有的行到目標表中,不需要連線源表和目標表
4、update子句後面可以跟delete子句來去除一些不需要的行
MERGE語句的使用!
今天需要更新乙個表的標識,需要和另外乙個表關聯,但是update無法做到這點。a表中有乙個memo,b表中有乙個欄位存了幾個string,當b表中的任何乙個string為a表中的memo的子串時,更新a表中flag。update如下 update passap.tb finpay vth check...
merge的典型使用
include標籤常用於將布局中的公共部分提取出來供其他layout共用,以實現布局模組化,這在布局編寫方便提供了大大的便利。在使用了include後可能導致布局巢狀過多,多餘不必要的layout節點,從而導致解析變慢。所以可使用merge較少層數 merge標籤可用於兩種典型情況 a.布局頂結點是...
Merge 語句的使用
db2 merge 語句的作用非常強大,它可以將乙個表中的資料合併到另乙個表中,在合併的同時可以進行插入 刪除 更新等操作。我們還是先來看個簡單的例子吧,假設你定義了乙個雇員表 employe 乙個經理表 manager 如下所示 雇員表 employe create table employe e...