SQL中Merge用法詳解
MERGE語(yǔ)句是SQL語(yǔ)句的一種。在SQL Server、Oracle數(shù)據(jù)庫(kù)中可用,MySQL、PostgreSQL中不可用。MERGE是Oracle9i新增的語(yǔ)法,用來合并UPDATE和INSERT語(yǔ)句。通過MERGE語(yǔ)句,根據(jù)一張表(原數(shù)據(jù)表,source table)或子查詢的連接條件對(duì)另外一張(目標(biāo)表,target table)表進(jìn)行查詢,連接條件匹配上的進(jìn)行UPDATE,無法匹配的執(zhí)行INSERT。這個(gè)語(yǔ)法僅需要一次全表掃描就完成了全部工作,執(zhí)行效率要高于INSERT+UPDATE。
merge主要用于兩表之間的關(guān)聯(lián)操作
oracle中 merge:
從oracle 9i開始支持merge用法,10g有了完善
create table a (id_ integer,count_ integer); insert into a values(1,3); insert into a values(3,6); create table b (id_ integer,count_ integer); insert into b values(1,7); insert into b values(2,4); MERGE INTO a USING b ON (a.id_ = b.id_) WHEN MATCHED THEN UPDATE SET count_ = b.count_+a.count_ /* 注意指名count_屬于的表 */ WHEN NOT MATCHED THEN INSERT VALUES (b.id_,b.count_); commit; select * from a;
結(jié)果:
id_ count_
1 10
3 6
2 4
SQL Server 2008開始支持merge:
有兩張結(jié)構(gòu)一致的表:test1,test2
create table test1 (id int,name varchar(20)) go create table test2 (id int,name varchar(20)) go insert into test1(id,name) values(1,'boyi55'),(2,'51cto'),(3,'bbs'),(4,'fengjicai'),(5,'alis') insert into test2(id,name) values(1,'boyi'),(2,'51cto')
將test1同步到test2中,沒有的數(shù)據(jù)進(jìn)行插入,已有數(shù)據(jù)進(jìn)行更新
merge test2 t --要更新的目標(biāo)表 using test1 s --源表 on t.id=s.id --更新條件(即主鍵) when matched --如果主鍵匹配,更新 then update set t.name=s.name when not matched then insert values(id,name);--目標(biāo)主未知主鍵,插入。此語(yǔ)句必須以分號(hào)結(jié)束
運(yùn)行以下查詢查看更新結(jié)果
select a.id,a.name as name_1,b.name as name_2 from test1 as a,test2 as b where a.id=b.id
id name_1 name_2
----------- -------------------- --------------------
1 boyi55 boyi55
2 51cto 51cto
3 bbs bbs
4 fengjicai fengjicai
5 alis alis
相關(guān)文章
SqlServer 獲取字符串中小寫字母的sql語(yǔ)句
這篇文章主要介紹了SqlServer 獲取字符串中小寫字母的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05圖解SSIS批量導(dǎo)入Excel文件的實(shí)現(xiàn)方法
本篇文章是對(duì)SSIS批量導(dǎo)入Excel文件的實(shí)現(xiàn)方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06SQL Server中使用Trigger監(jiān)控存儲(chǔ)過程更改腳本實(shí)例
這篇文章主要介紹了SQL Server中使用Trigger監(jiān)控存儲(chǔ)過程更改腳本實(shí)例,本文使用一個(gè)表來記錄存儲(chǔ)過程更改過程,需要的朋友可以參考下2015-07-07SQL創(chuàng)建數(shù)據(jù)庫(kù)時(shí)遇到:在數(shù)據(jù)庫(kù)master中拒絕了 CREATE DATABASE 權(quán)限
今天在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候,遇到了沒有創(chuàng)建數(shù)據(jù)庫(kù)權(quán)限的問題,本文主要介紹了SQL創(chuàng)建數(shù)據(jù)庫(kù)時(shí)遇到:在數(shù)據(jù)庫(kù)master中拒絕了CREATE DATABASE權(quán)限,感興趣的可以了解一下2024-04-04SQL Server中使用判斷語(yǔ)句(IF ELSE/CASE WHEN )案例
這篇文章主要介紹了SQL Server中使用判斷語(yǔ)句(IF ELSE/CASE WHEN )案例,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07SQLServer 附加數(shù)據(jù)庫(kù)后出現(xiàn)只讀或失敗的解決方法
如果你在附加SQL數(shù)據(jù)庫(kù),出現(xiàn)只讀或失敗的情況,來看下本文的解決方案吧。2010-03-03Visual?Studio2022連接SQL?Server數(shù)據(jù)庫(kù)的詳細(xì)圖文教程
在visual studio中經(jīng)常會(huì)用到SQL的數(shù)據(jù),關(guān)于數(shù)據(jù)連接總是會(huì)出現(xiàn)一系列的問題,下面這篇文章主要給大家介紹了關(guān)于Visual?Studio2022連接SQL?Server數(shù)據(jù)庫(kù)的詳細(xì)圖文教程,需要的朋友可以參考下2023-06-06在 SQLSERVER 中快速有條件刪除海量數(shù)據(jù)
最近有個(gè)朋友問我,他說他在SQLSERVER刪除幾百萬(wàn)到幾千萬(wàn)數(shù)據(jù)是顯的很慢,幫他分析了一下,提了一些以下意見,或許對(duì)很多人有用。2008-10-10萬(wàn)能密碼的SQL注入漏洞其PHP環(huán)境搭建及防御手段
這篇文章主要介紹了萬(wàn)能密碼的SQL注入漏洞其PHP環(huán)境搭建及防御手段,對(duì)此感興趣的小伙伴趕快收藏起來吧2021-09-09SQL Server在AlwaysOn中使用內(nèi)存表的“踩坑”記錄
這篇文章主要給大家介紹了關(guān)于SQL Server在AlwaysOn中使用內(nèi)存表的一些"踩坑"記錄,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)下吧。2017-09-09