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 帶有OUTPUT的INSERT,DELETE,UPDATESQLServerdelete
- Sqlserver、oracle中Merge的使用方法,一個merge語句搞定多個Insert,Update,Delete操作SQLServerOracledelete
- SQLite語句(二):INSERT DELETE UPDATE SELECTSQLitedelete
- mysql 在delete、insert、update 時,page的變化MySqldelete
- DBeaver如何生成select,update,delete,insert語句delete
- 利用insert,update和delete注入獲取資料delete
- KunlunDB功能之insert/update/delete...returning語句delete
- 輕量ORM-SqlRepoEx (四)INSERT、UPDATE、DELETE 語句ORMSQLdelete
- Hive學習筆記 ---- 支援Update和Delete以及MergeHive筆記delete
- Sql server with as update用法SQLServer
- java-Mybatis XML 對映器(select,insert, update 和 delete)JavaMyBatisXMLdelete
- mysql實現merge功能之DUPLICATE key UPDATE語法MySql
- ORACLE sql merge into update where條件位置與效能消耗OracleSQL
- lightdb -- merge into insert 相容 OracleOracle
- 1089 Insert or Merge (25分)
- SQL Server 2022 RTM 最新累積更新:Cumulative Update #13 for SQL Server 2022 RTMSQLServer
- Oracle\MS SQL Server Update多表關聯更新OracleSQLServer
- MyBatis(五) insert、update、delete 、主鍵回填、返回matched行數和affected行數、引數配置#{},${}MyBatisdelete
- SQL Server 2022 RTM Cumulative Update #15 釋出下載SQLServer
- Laravel5.6 如何列印 SQL?insert/update/select 列印方法總結LaravelSQL
- 380. Insert Delete GetRandom O (1)deleterandom
- sql merge intoSQL
- 簡單練習Microsoft SQL Server MERGE同步兩個表ROSSQLServer
- [LeetCode] 380. Insert Delete GetRandom O(1)LeetCodedeleterandom
- mysql update join,insert select 語法MySql
- MySQL insert on duplicate key update 死鎖MySql
- Sqlserver update\delete用inner join關聯,會update\delete關鍵字後面的表關聯到的行SQLServerdelete
- SQL中Merge的用法SQL
- SQL__INSERTSQL
- SQL__DELETESQLdelete
- MySQL 關於 INSERT INTO...ON DUPLICATE KEY UPDATE 的使用MySql
- mybatis 批量新增insert、更新update詳解MyBatis
- 【SQL】9 SQL INSERT INTO 語句SQL
- 【SQL】11 SQL DELETE 語句SQLdelete
- PostgreSQL、Oracle/MySQL和SQL Server的MVCC實現原理方式OracleMySqlServerMVC
- 如何在SQL Server中實現 Limit m,n 的功能SQLServerMIT
- SQL__UPDATESQL
- BUG: pymysql executemany不支援insert on duplicate key updateMySql