SQL Server的Merge —— 一步實現 insert,update,delete
USE tempdb
GO
IF OBJECT_ID('SourceTable') IS NOT NULL
DROP TABLE SourceTable
IF OBJECT_ID('TargetTable') IS NOT NULL
DROP TABLE TargetTable
--源
CREATE TABLE SourceTable(id INT,[desc] NVARCHAR(50))
--目標
CREATE TABLE TargetTable(id INT,[desc] NVARCHAR(50))
--源表資料
INSERT INTO SourceTable VALUES (1,'描述1'),(2,'描述2'),(3,'描述3'),(4,'描述4')
--目標表資料
INSERT INTO TargetTable VALUES (1,'在源表裡存在,將會被更新')
INSERT INTO TargetTable VALUES (2,'在源表裡存在,將會被更新')
INSERT INTO TargetTable VALUES (5,'在源表裡不存在,將會被刪除')
INSERT INTO TargetTable VALUES (6,'在源表裡不存在,將會被刪除')
SELECT * FROM SourceTable AS st
/*
id desc
1 描述1
2 描述2
3 描述3
4 描述4
*/
SELECT * FROM TargetTable AS tt
/*
id desc
1 在源表裡存在,將會被更新
2 在源表裡存在,將會被更新
5 在源表裡不存在,將會被刪除
6 在源表裡不存在,將會被刪除
*/
--注意事項
--1.最後的分號必須有
--2.源表可以是一個具體的表,也可以是一個子查詢語句
--3.2008或以上版本才有的功能
MERGE INTO TargetTable AS T --可新增 TOP 限制操作行數: MERGE TOP(2)
USING SourceTable AS S
ON T.id=S.id
WHEN MATCHED --當兩者的id能匹配,id=1,2的資料被更新
THEN UPDATE SET T.[desc]=s.[desc]
WHEN NOT MATCHED --目標表沒有的ID, 在原表中有,則插入相關的資料
THEN INSERT VALUES(s.id,s.[desc])
WHEN NOT MATCHED BY SOURCE --目標表中存在,源表不存在,則刪除
THEN DELETE
OUTPUT $ACTION AS [Action]
,INSERTED.id AS [插入的id]
,INSERTED.[desc] AS [插入的DESC]
,DELETED.id AS [刪除的id]
,DELETED.[desc] AS [刪除的DESC]
;
/*
Action 插入的id 插入的DESC 刪除的id 刪除的DESC
INSERT 3 描述3 NULL NULL
INSERT 4 描述4 NULL NULL
UPDATE 1 描述1 1 在源表裡存在,將會被更新
UPDATE 2 描述2 2 在源表裡存在,將會被更新
DELETE NULL NULL 5 在源表裡不存在,將會被刪除
DELETE NULL NULL 6 在源表裡不存在,將會被刪除
*/
SELECT * FROM SourceTable AS st
/*
id desc
1 描述1
2 描述2
3 描述3
4 描述4
*/
SELECT * FROM TargetTable AS tt
/*
id desc
1 描述1
2 描述2
3 描述3
4 描述4
*/
相關文章
- sql server merge 做insert和updateSQLServer
- sql server 帶有OUTPUT的INSERT,DELETE,UPDATESQLServerdelete
- MERGE新特性(UPDATE WHERE,DELETE WHERE,INSERT WHERE)delete
- SQL Server 2008中SQL增強之三:Merge(在一條語句中使用Insert,Update,Delete)SQLServerdelete
- LINQ to SQL語句之Insert/Update/Delete操作SQLdelete
- Sqlserver、oracle中Merge的使用方法,一個merge語句搞定多個Insert,Update,Delete操作SQLServerOracledelete
- 34、VIEW可以insert,delete,update.Viewdelete
- Default Locking for INSERT, UPDATE, DELETE, and SELECT ... FOR UPDATE (351)delete
- mysql innodb新建索引堵塞update ,insert,deleteMySql索引delete
- 用merge 語句代替 insert 和deletedelete
- mysql 在delete、insert、update 時,page的變化MySqldelete
- MySQL之資料的insert-delete-update操作MySqldelete
- 模擬insert,update和delete造成阻塞的示例delete
- SQLite語句(二):INSERT DELETE UPDATE SELECTSQLitedelete
- MongoDB入門系列(二):Insert、Update、Delete、DropMongoDBdelete
- 利用insert,update和delete注入獲取資料delete
- Oracle資料庫中Insert、Update、Delete操作速度Oracle資料庫delete
- DBeaver如何生成select,update,delete,insert語句delete
- Delete,insert,update與undo的關係[轉載TOM文章]delete
- sql server merge 的用法SQLServer
- Hive學習筆記 ---- 支援Update和Delete以及MergeHive筆記delete
- 【SQL Server學習筆記】Delete 語句、Output 子句、Merge語句SQLServer筆記delete
- Merge into: Oracle中用一條SQL語句直接進行Insert/Update的操作(R1)OracleSQL
- KunlunDB功能之insert/update/delete...returning語句delete
- 索引是否也能提高UPDATE,DELETE,INSERT速度 解釋索引delete
- Sql server with as update用法SQLServer
- delete duplication record in sql serverdeleteSQLServer
- 輕量ORM-SqlRepoEx (四)INSERT、UPDATE、DELETE 語句ORMSQLdelete
- myisam對於update,insert,delete關於auto_incremant的影響deleteREM
- innodb對於update,insert,delete關於auto_incremant的影響deleteREM
- java-Mybatis XML 對映器(select,insert, update 和 delete)JavaMyBatisXMLdelete
- 檢視insert,delete,update對基表的影響(檢視初識)delete
- Sql Server系列:Delete語句SQLServerdelete
- mysql實現merge功能之DUPLICATE key UPDATE語法MySql
- Sql Server系列:Update語句SQLServer
- SQL Server中的Merge關鍵字SQLServer
- 【MyBatis原始碼分析】insert方法、update方法、delete方法處理流程(上篇)MyBatis原始碼delete
- 【MyBatis原始碼分析】insert方法、update方法、delete方法處理流程(下篇)MyBatis原始碼delete