MERGE命令使用

2021-08-25 03:42:13 字數 1878 閱讀 6739

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