Oracle資料庫中 merge into的用法

2021-09-10 05:29:59 字數 4781 閱讀 3362

oracle9g引入了merge命令,你能夠在乙個sql語句中對乙個表同時執行inserts和update操作. merge命令從乙個或多個資料來源中選擇行來update或insert到乙個或多個表.在oracle 10g中merge有如下一些改進:

1、update或insert子句是可選的

2、update和insert子句可以加where子句

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

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

5、源表就是using關鍵字後面跟的表,目標表就是將要被merge into的表

6、merge into 中所有的update、insert、delete都是針對目標表來操作的。由於merge into已經制定了操作的表,所以update、insert、delete都不需要再顯示指出表名

7、總之,merge into的作用就是 解決用b表跟新a表資料,如果a表中沒有,則把b表的資料插入a表或向乙個表中插入資料,如果該錶已有該資料則更新,反之新增資料。

語法:

merge

into

[your table-name]

[rename your table here]

using

([write your query here]

)[rename your query-sql and using just like a table]on(

[conditional expression here]

and[

...]

...)

when

mathed

then

[here you can execute some update sql or something else

]when

notmathed

then

[execute something else here !

]

接下來我們來直接進行測試:

首先建立乙個表test_one

create table test_one(id

number not null

primary key,

name

varchar2

(255),

ipvarchar2

(255),

memo

varchar2

(255))

commit;

隨便新增幾條資料作為測試資料

insert

into

test_one(id

,name,ip

,memo

)values(1

,'2'

,'3'

,'周文軍');

insert

into

test_one(id

,name,ip

,memo

)values(2

,'66'

,'366'

,'2656');

insert

into

test_one(id

,name,ip

,memo

)values(3

,'5656'

,'626'

,'2626');

insert

into

test_one(id

,name,ip

,memo

)values(4

,'5656'

,'2626'

,'626'

);

好了,我們的資料表已經建成,如下圖:

如果我們需要新增一條資料,一般會這樣進行

insert

into

test_one(id

,name,ip

,memo

)values(5

,'mrhu'

,'127.0.0.1.0'

,'王先生的ip'

);

但我們希望可以先用id進行判斷,沒有該資料新增,有該資料更新,怎麼實現呢?

那麼merge into命令來了,直接擼**:

merge into test_one mtb using

(select '5'

as id,

'mrhu'

as name,

'127.0.0.1.0'

as ip,

'王先生的ip'

as memo from dual)mmb on

(mtb.id = mmb.id)

when matched then

update set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo

when not matched then

insert

(mtb.id, mtb.name,mtb.ip,mtb.memo)

values

(mmb.id,mmb.name,mmb.ip,mmb.memo)

;

執行如下:

我們再來看看表中資料:

資料新增成功!

那麼我們如何測試更新呢?很簡單,我們將memo=『王先生的ip』 改為 memo=『本大美女的ip』來進行測試

merge into test_one mtb using

(select '5'

as id,

'mrhu'

as name,

'127.0.0.1.0'

as ip,

'本大美女的ip'

as memo from dual)mmb on

(mtb.id = mmb.id)

when matched then

update set mtb.name = mmb.name,mtb.ip = mmb.ip,mtb.memo=mmb.memo

when not matched then

insert

(mtb.id, mtb.name,mtb.ip,mtb.memo)

values

(mmb.id,mmb.name,mmb.ip,mmb.memo)

;

執行如下:

我們再來看看表中資料:

資料更新成功啦!

我們再建立乙個表test_two作為表b,test_one作為表a

create table tes(id

number not null

primary key,

code

varchar2

(255),

memo

varchar2

(255))

;commit;

好了 表test_two建立好了,我們先來新增一條資料吧!

insert into root.test_two (id, code, memo) values (5, 'mrhu', '隔壁老王的ip');
我們再看看test_two中的資料:

我們來將test_one中的資料導到我們新建的表中,通過分析,我們發現,test_two 表中有了一條資料,id為5,test_one中也有一條id為5的資料,預期執行效果為test_twoid為5的資料的memo字段值將更新為test_one中的『本大美女的ip』,其他值進行新增操作。

我們寫**來驗證一下:

merge into test_two mtb using

(select id,name,ip,memo from

test_one

) mmb on

(mtb.id = mmb.id)

when matched then

update

set mtb.code = mmb.name,mtb.memo = mmb.memo

when not matched then

insert

(mtb.id,mtb.code,mtb.memo)

values

(mmb.id,mmb.name,mmb.memo)

;

我們來看看效果:

執行結果與預期結果一致,好了,merge into的用法你們學會了嗎! 喜歡的關注支援一下!

資料庫 Oracle中建立資料庫

create database lihua 網上的說法是 oracle中的例項只對應乙個資料庫,出現此種情況說明oracle資料庫處於mount 裝載 或open狀態,需要使用startup nomount語句進行狀態更改,或者是直接使用dbca的圖形介面來建立 注 經測試,startup nomo...

oracle資料庫中sql notfound的用法

sql notfound 是乙個布林值。與最近的sql語句 update,insert,delete,select 發生互動,當最近的一條sql語句沒有涉及任何行的時候,則返回true。否則返回false。這樣的語句在實際應用中,是非常有用的。例如要update一行資料時,如果沒有找到,就可以作相應...

oracle資料庫中sql notfound的用法

sql notfound 是乙個布林值。與最近的sql語句 update,insert,delete,select 發生互動,當最近的一條sql語句沒有涉及任何行的時候,則返回true。否則返回false。這樣的語句在實際應用中,是非常有用的。例如要update一行資料時,如果沒有找到,就可以作相應...