搜尋
首頁資料庫mysql教程SQLServer 2008 Merge 的机制探讨

SQL Server 2008 引入了一个Merge关键字,MSDN有对这个关键字的解释和范例。传送门:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx 微软官方解释是: 根据与源表联接的结果,对目标表执行插入、更新或删除操作。 例如,根据在另一个表中找到的差异

       SQL Server 2008 引入了一个Merge关键字,MSDN有对这个关键字的解释和范例。传送门:http://msdn.microsoft.com/zh-cn/library/bb510625.aspx 微软官方解释是:根据与源表联接的结果,对目标表执行插入、更新或删除操作。例如,根据在另一个表中找到的差异在一个表中插入、更新或删除行,可以对两个表进行同步。如果这个官方解释用白话文说就是:插入,更新和删除一步到位!

       场景1:数据监测

       这里有一个场景是,有一个旧总的商品表(AllProduct),还有一个新采集的商品表(Product)。总的商品表里面的数据比较陈旧,一些新的数据还没有加到里面去,而且有些旧的数据不正确。我们现在要根据商品Code来比对,如果旧表与新表的Code相同,但是名字不同,以新表的名字为准,更新旧表里面的商品名称。如果新的商品的记录在旧表里面不存在,那么把新表里面的数据插入到旧表里面去。新表和旧表的表结构完全相同。说了这么多,可能有点绕,那么总结下就是:

       1)两张表(新表和旧表)的结构相同数据不同;

       2)新表里面的数据如果不存在(根据主键进行匹配)于旧表,则把新表的数据插入旧表

       3)旧表中的记录的ID如果和新表的记录的ID相同,但是Name不同,则将更新旧表中的Name为新表中的Name

       初始化环境的Sql代码如下:

 

if OBJECT_ID('AllProducts') is not null  
drop table AllProducts  
go  

Create table AllProducts
(
	P_ID int not null identity(1,1) primary key,
	P_Name Nvarchar(20) null,
	P_Code NVarchar(30) null,
	P_Date datetime null
)
go 

Insert into AllProducts (P_Name,P_Code,P_Date) values 
('ProductA','Pro_A',GETDATE()),
('ProductB','Pro_B',GETDATE()),  
('ProductB','Pro_C',GETDATE()),  
('ProductD','Pro_D',GETDATE()),
('ProductE','Pro_E',GETDATE())  

if OBJECT_ID('Product') is not null  
drop table Product  
go 
Create table Product 
(
	P_ID int not null identity(1,1) primary key,
	P_Name Nvarchar(20) null,
	P_Code NVarchar(30) null,
	P_Date datetime null
)
go  

Insert into Product (P_Name,P_Code,P_Date)  
values  
('ProductA','Pro_A',GETDATE()),
('ProductC','Pro_C',GETDATE()),
('ProductF','Pro_F',GETDATE())

select * from AllProducts;
select * from Product;

输出结果如下:

SQLServer 2008 Merge 的机制探讨
根据我们确定的规则,即将发生如下更新和插入:

1)更新:AllProduct表中的name为Pro_A和name为Pro_C的记录会被匹配到,然后由于Pro_C对应的Name不同,所以AllProecudt表中的Name会被更新。

2)插入:AllProduct表中没有Pro_F这条记录,所以会被插入到AllProduct表中

我们使用Merge的sql如下:

--确定目标表
Merge Into AllProducts p
--从数据源查找编码相同的产品
using Product s on p.P_Code=s.P_Code
--如果编码相同,则更新目标表的名称
When Matched and P.P_Names.P_Name Then Update set P.P_Name=s.P_Name
--如果目标表中不存在,则从数据源插入目标表
--When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate);
When Not Matched By Target Then Insert values (s.P_Name,s.P_Code,s.P_Date);

上面注释的那条语句和下面的那个意义相同,只是没有那么简洁。执行结果如下:

SQLServer 2008 Merge 的机制探讨

第一条记录已经被更新,第二条记录是从Product表中插入的,是不是真的很简洁。

场景2:数据表同步

如果希望AllProdct和Product表一模一样,即数据同步,那么我们需要删掉Product表中不存在于AllProduct表中的记录。整个sql如下:

--确定目标表
Merge Into AllProducts p
--从数据源查找编码相同的产品
using Product s on p.P_Code=s.P_Code
--如果编码相同,则更新目标表的名称
When Matched and P.P_Names.P_Name Then Update set P.P_Name=s.P_Name
--如果目标表中不存在,则从数据源插入目标表
--When Not Matched By Target Then Insert (DName,DCode,DDate) values (s.DName,s.DCode,s.DDate);
When Not Matched By Target Then Insert values (s.P_Name,s.P_Code,s.P_Date)
--如果数据源的行在目标表中不存在,则删除源表行
When Not Matched By Source Then Delete;

总结:Merge是同时做插入和更新,效率据说更高。


 

 

 


 

 

 

       

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)Apr 10, 2025 am 09:36 AM

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL:開發人員的基本技能MySQL和SQL:開發人員的基本技能Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

描述MySQL異步主奴隸複製過程。描述MySQL異步主奴隸複製過程。Apr 10, 2025 am 09:30 AM

MySQL異步主從復制通過binlog實現數據同步,提升讀性能和高可用性。 1)主服務器記錄變更到binlog;2)從服務器通過I/O線程讀取binlog;3)從服務器的SQL線程應用binlog同步數據。

mysql:簡單的概念,用於輕鬆學習mysql:簡單的概念,用於輕鬆學習Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL:數據庫的用戶友好介紹MySQL:數據庫的用戶友好介紹Apr 10, 2025 am 09:27 AM

MySQL的安裝和基本操作包括:1.下載並安裝MySQL,設置根用戶密碼;2.使用SQL命令創建數據庫和表,如CREATEDATABASE和CREATETABLE;3.執行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.創建索引和存儲過程以優化性能和實現複雜邏輯。通過這些步驟,你可以從零開始構建和管理MySQL數據庫。

InnoDB緩衝池如何工作,為什麼對性能至關重要?InnoDB緩衝池如何工作,為什麼對性能至關重要?Apr 09, 2025 am 12:12 AM

InnoDBBufferPool通過將數據和索引頁加載到內存中來提升MySQL數據庫的性能。 1)數據頁加載到BufferPool中,減少磁盤I/O。 2)臟頁被標記並定期刷新到磁盤。 3)LRU算法管理數據頁淘汰。 4)預讀機制提前加載可能需要的數據頁。

MySQL:初學者的數據管理易用性MySQL:初學者的數據管理易用性Apr 09, 2025 am 12:07 AM

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

與MySQL中使用索引相比,全表掃描何時可以更快?與MySQL中使用索引相比,全表掃描何時可以更快?Apr 09, 2025 am 12:05 AM

全表掃描在MySQL中可能比使用索引更快,具體情況包括:1)數據量較小時;2)查詢返回大量數據時;3)索引列不具備高選擇性時;4)複雜查詢時。通過分析查詢計劃、優化索引、避免過度索引和定期維護表,可以在實際應用中做出最優選擇。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中