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一行資料時,如果沒有找到,就可以作相應...